我正在使用LINQ to SQL查询来返回应用程序中的数据。但是我发现现在需要返回列Names。试试我可能完全无法在互联网上找到如何做到这一点。
因此,如果我的LINQ实体表具有属性(Last_Name,First_name,Middle_Name),我需要返回:
Last_name
First_Name
Middle_name
而不是通常的
Smith
John
Joe
答案 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
请阅读康拉德关于每种方法的说明的答案!