我正在使用LINQ to SQL查詢在我的應用程序中返回數據。但是我發現現在需要返回列名稱。嘗試我可能完全無法找到如何在互聯網上做到這一點。如何返回LINQ實體的列名稱
所以,如果我的LINQ實體表有屬性(姓氏,FIRST_NAME,Middle_Name)我需要返回:
Last_name
First_Name
Middle_name
而不是通常的
Smith
John
Joe
我正在使用LINQ to SQL查詢在我的應用程序中返回數據。但是我發現現在需要返回列名稱。嘗試我可能完全無法找到如何在互聯網上做到這一點。如何返回LINQ實體的列名稱
所以,如果我的LINQ實體表有屬性(姓氏,FIRST_NAME,Middle_Name)我需要返回:
Last_name
First_Name
Middle_name
而不是通常的
Smith
John
Joe
你當然可以用一些LINQ到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),
};
讓我們假設你在談論名爲YourAssembly
的組件中的表MyDataContext
使用Refl的使用Refl對一個表撓度
您可以使用反射來獲取你一樣的屬性會從屬性的任何類型的
VAR性能=在 Type.GetType( 「YourAssembly.Contact」)。GetProperties中() 選擇property.Name ;
foreach (var property in properties) Console.WriteLine(property);
由於shaunmartin筆記這將返回所有屬性不只是列映射的。還應該指出,這將只返回公共屬性。你需要包括的GetProperties的bindingAttr參數來獲取非公開性質
使用元模型
您可以使用元模型System.Data.Linq.Mapping拿到領域的BindingFlags值(我加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();
我偶然發現了這個答案,以解決我自己的問題,並使用Conrad Frix的答案。雖然這個問題指定了VB.NET,我也是這樣編程的。這裏是康拉德在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
請同時閱讀康拉德的每種方法的筆記答案!
是不是在您的對象屬性映射到表列?你還能得到什麼數據? – gbn 2011-02-02 19:46:57
你使用的是什麼樣的貼圖?屬性? XML? – 2011-02-02 19:50:15
數據上下文是使用XML映射創建的。 – Neberu 2011-02-02 20:10:47