2011-02-02 54 views
1

我正在使用LINQ to SQL查詢在我的應用程序中返回數據。但是我發現現在需要返回列名稱。嘗試我可能完全無法找到如何在互聯網上做到這一點。如何返回LINQ實體的列名稱

所以,如果我的LINQ實體表有屬性(姓氏,FIRST_NAME,Middle_Name)我需要返回:

Last_name 
First_Name 
Middle_name 

而不是通常的

Smith 
John 
Joe 
+1

是不是在您的對象屬性映射到表列?你還能得到什麼數據? – gbn 2011-02-02 19:46:57

+0

你使用的是什麼樣的貼圖?屬性? XML? – 2011-02-02 19:50:15

+0

數據上下文是使用XML映射創建的。 – Neberu 2011-02-02 20:10:47

回答

2

你當然可以用一些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), 
    }; 
2

讓我們假設你在談論名爲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(); 
0

我偶然發現了這個答案,以解決我自己的問題,並使用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 

請同時閱讀康拉德的每種方法的筆記答案!

相關問題