Sql 如何返回LINQ实体的列名
我使用LINQ到SQL查询在我的应用程序中返回数据。但是,我发现现在需要返回列名。尽管我可能会尝试,但我完全无法在互联网上找到如何做到这一点 因此,如果我的LINQ实体表具有属性Last_Name、First_Name、Middle_Name,我需要返回: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的上下文中的联系人表 对桌子使用反射 您可以像使
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中使用。它还依赖于版本控制不太好的实现细节。