Sql 如何返回LINQ实体的列名

Sql 如何返回LINQ实体的列名,sql,vb.net,linq,linq-to-sql,Sql,Vb.net,Linq,Linq To Sql,我使用LINQ到SQL查询在我的应用程序中返回数据。但是,我发现现在需要返回列名。尽管我可能会尝试,但我完全无法在互联网上找到如何做到这一点 因此,如果我的LINQ实体表具有属性Last_Name、First_Name、Middle_Name,我需要返回: Last_name First_Name Middle_name 而不是通常 Smith John Joe 假设您正在讨论名为YourAssembly的程序集中名为MyDataContext的上下文中的联系人表 对桌子使用反射 您可以像使

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

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

Last_name
First_Name
Middle_name
而不是通常

Smith
John
Joe

假设您正在讨论名为YourAssembly的程序集中名为MyDataContext的上下文中的联系人表

对桌子使用反射

您可以像使用任何类型的反射一样使用反射来获取属性

var properties=中的from属性 Type.GetTypeYourAssembly.Contact.GetProperties 选择属性。名称 ;

        foreach (var property in properties)
            Console.WriteLine(property);
正如shaunmartin所指出的,这将返回所有属性,而不仅仅是列映射的属性。还应注意,这将仅返回公共财产。您需要为的bindingAttr参数包含一个值,以获取非公共属性

        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);
使用元模型

您可以使用元模型获取我添加的字段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();

假设您正在讨论名为YourAssembly的程序集中名为MyDataContext的上下文中的联系人表

对桌子使用反射

您可以像使用任何类型的反射一样使用反射来获取属性

var properties=中的from属性 Type.GetTypeYourAssembly.Contact.GetProperties 选择属性。名称 ;

        foreach (var property in properties)
            Console.WriteLine(property);
正如shaunmartin所指出的,这将返回所有属性,而不仅仅是列映射的属性。还应注意,这将仅返回公共财产。您需要为的bindingAttr参数包含一个值,以获取非公共属性

        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);
使用元模型

您可以使用元模型获取我添加的字段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();

当然,您可以直接针对.edmx文件或已编译程序集中的嵌入式模型资源,使用一些LINQ To Xml来实现这一点

下面的查询获取的是字段而不是列名。如果您需要这些列,那么只需更改查询即可

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),
    };

当然,您可以直接针对.edmx文件或已编译程序集中的嵌入式模型资源,使用一些LINQ To Xml来实现这一点

下面的查询获取的是字段而不是列名。如果您需要这些列,那么只需更改查询即可

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),
    };

我偶然发现了这个答案来解决我自己的问题,并使用了康拉德·弗里克斯的答案。这个问题指定了VB.NET,这就是我编程的地方。以下是Conrad在VB.NET中的答案。这些答案可能不是完美的翻译,但很有效:

例1

例2

例3

要显示结果,请执行以下操作:

    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

请阅读康拉德的答案,了解每种方法的注意事项

我偶然发现了这个答案来解决我自己的问题,并使用了康拉德·弗里克斯的答案。这个问题指定了VB.NET,这就是我编程的地方。以下是Conrad在VB.NET中的答案。这些答案可能不是完美的翻译,但很有效:

例1

例2

例3

要显示结果,请执行以下操作:

    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

请阅读康拉德的答案,了解每种方法的注意事项

它不是在对象属性到表列的映射中吗?除此之外,您将如何获取数据?您使用的是哪种映射?属性?XML?数据上下文是使用XML映射创建的。它不是在对象属性到表列的映射中吗?除此之外,您将如何获取数据?您使用的是哪种映射?属性?XML?数据上下文是使用XML映射创建的。小心-这将返回所有属性,而不仅仅是列映射属性。小心-这将返回所有属性,而不仅仅是列映射属性。有趣的替代方法。除非将构建操作更改为Embedded Resource或将edmx作为部署的一部分,否则一旦部署,这将不起作用。当模式名称空间更改为/2008/10和2008/09时,这也只能在3.5中使用。它还依赖于版本控制不太好的实现细节。除非将构建操作更改为Embedded Resource或将edmx作为部署的一部分,否则一旦部署,这将不起作用。当模式名称空间更改为/2008/10和2008/09时,这也只能在3.5中使用。它还依赖于版本控制不太好的实现细节。