如何返回LINQ实体的列名

时间:2011-02-02 19:44:28

标签: sql vb.net linq linq-to-sql

我正在使用LINQ to SQL查询来返回应用程序中的数据。但是我发现现在需要返回列Names。试试我可能完全无法在互联网上找到如何做到这一点。

因此,如果我的LINQ实体表具有属性(Last_Name,First_name,Middle_Name),我需要返回:

Last_name
First_Name
Middle_name

而不是通常的

Smith
John
Joe

3 个答案:

答案 0 :(得分:2)

让我们假设您正在讨论名为Contact

的上下文中名为YourAssembly的程序集中的MyDataContext

对表使用反射

您可以使用反射来获取类似于任何类型的属性

  

var properties = from property in   Type.GetType( “YourAssembly.Contact”)。GetProperties中()                                选择property.Name                                ;

        foreach (var property in properties)
            Console.WriteLine(property);

正如shaunmartin所说,这将返回所有属性,而不仅仅是列映射的属性。还应注意,这将仅返回公共属性。您需要为BindingFlags的bindingAttr参数添加GetProperties值以获取非公共属性

使用元模型

您可以使用元模型System.Data.Linq.Mapping来获取字段(我添加了IsPersistant以仅获取列映射属性)

        AttributeMappingSource mappping = new System.Data.Linq.Mapping.AttributeMappingSource();
        var model = mappping.GetModel(typeof (MyDataContext));
        var table = model.GetTable(typeof (Contact));

        var qFields= from fields in table.RowType.DataMembers
                where fields.IsPersistent == true
                select fields;

        foreach (var field in qFields)
            Console.WriteLine(field.Name);

使用查询结果中的反射

另一方面,如果你想从查询结果中获得它,你仍然可以使用反射。

        MyDataContextdc = new MyDataContext();
        Table<Contact> contacts = dc.GetTable<Contact>();
        var q = from c in contacts
                select new
                {
                    c.FirstName,
                    c.LastName
                };


        var columns = q.First();
        var properties = (from property in columns.GetType().GetProperties()
                        select property.Name).ToList();

答案 1 :(得分:2)

你当然可以使用一些LINQ-To-Xml直接针对“.edmx”文件或编译程序集中的嵌入式模型资源。

以下查询获取字段(而不是列)名称。如果您需要列,则只需更改查询以适应。

var edmxNS = XNamespace.Get(@"http://schemas.microsoft.com/ado/2007/06/edmx");
var schemaNS = XNamespace.Get(@"http://schemas.microsoft.com/ado/2006/04/edm");

var xd = XDocument.Load(@"{path}\Model.edmx");

var fields =
    from e in xd
        .Elements(edmxNS + "Edmx")
        .Elements(edmxNS + "Runtime")
        .Elements(edmxNS + "ConceptualModels")
        .Elements(schemaNS + "Schema")
        .Elements(schemaNS + "EntityType")
    from p in e
        .Elements(schemaNS + "Property")
    select new
    {
        Entity = e.Attribute("Name").Value,
        Member = p.Attribute("Name").Value,
        Type = p.Attribute("Type").Value,
        Nullable = bool.Parse(p.Attribute("Nullable").Value),
    };

答案 2 :(得分:0)

我偶然发现了这个问题来解决我自己的问题并使用了康拉德弗里克斯的答案。这个问题指的是VB.NET,这就是我编程的内容。这里是Conrad在VB.NET中的答案(它们可能不是一个完美的翻译,但它们有效):

示例1

    Dim PropertyNames1 = From Prprt In Type.GetType("LocalDB.tlbMeter").GetProperties()
                         Select Prprt.Name

示例2

    Dim LocalDB2 As New LocalDBDataContext
    Dim bsmappping As New System.Data.Linq.Mapping.AttributeMappingSource()
    Dim bsmodel = bsmappping.GetModel(LocalDB2.GetType())
    Dim bstable = bsmodel.GetTable(LocalDB.tblMeters.GetType())

    Dim PropertyNames2 As IQueryable(Of String) = From fields In bstable.RowType.DataMembers
                                                  Where fields.IsPersistent = True
                                                  Select fields.Member.Name  'IsPersistant to only get the Column Mapped properties

示例3

    Dim LocalDB3 As New LocalDBDataContext
    Dim qMeters = From mtr In LocalDB3.tblMeters
                  Select mtr


    Dim FirstResult As tblMeter = qMeters.First()
    Dim PropertyNames3 As List(Of String) = From FN In FirstResult.GetType().GetProperties()
                                            Select FN.Name.ToList()

显示结果:

    For Each FieldName In PropertyNames1
        Console.WriteLine(FieldName)
    Next

    For Each FieldName In PropertyNames2
        Console.WriteLine(FieldName)
    Next

    For Each FieldName In PropertyNames3
        Console.WriteLine(FieldName)
    Next

请阅读康拉德关于每种方法的说明的答案!