2008-12-11 84 views
3

我期待獲得從模型返回的列名稱列表。任何人都知道如何做到這一點,任何幫助將不勝感激。如何從模型LINQ獲取列名?

示例代碼:

var project = db.Projects.Single(p => p.ProjectID.Equals(Id)); 

此代碼將返回項目對象,我怎麼會得到這個模型中的所有列名的列表。

謝謝

回答

1

對不起,我沒有LINQ的工作經驗。

這完全基於查看MSDN。

DataContext有一個Mapping屬性,它返回一個MetaModel的實例。
MetaModelGetMetaType,需要Type。在你的情況下,它可能是typeof(Project)
GetMetaType返回一個MetaType其中有GetDataMember方法,其中需要MemberInfo參數。您將不得不在Projects對象上使用反射來獲取MemberInfo對象。
MetaDataMemberGetDataMember返回的實例應該擁有所有你需要的東西。

我希望我有些在正確的方向(純粹看MSDN &穿越)

+0

除了`MetaType.GetDataMember(MemberInfo)`,您可以使用[`MetaType.PersistedDataMembers`](http://msdn.microsoft.com/zh-cn/library/ system.data.linq.mapping.metatype.persistentdatamembers.aspx),它返回[`MetaDataMember`]的集合(http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.metadatamember .aspx)對象,它具有你需要的Name,MappedName,IsPrimaryKey等屬性,然後你就不需要Reflection了PersistedDataMembers只返回持久化的屬性,而DataMembers會給你所有的屬性。 – 2011-10-20 04:35:58

0

您的列應該被映射爲項目模型中的屬性。我不確定在使用LINQ to SQL時是否可以獲得底層數據庫結構。 LINQ to SQL的全部要點是將數據庫抽象出來。

3

您的項目包裝將有一組屬性,每個屬性都有一個[Column]屬性。所以只需使用反射來枚舉具有該屬性的屬性即可。

+0

我不明白爲什麼這麼多的解決方案,使用反射。 Scott Gu將IQueryable轉換爲DataTable的解決方案使用反射從TableAttribute裝飾的表實體中構建模式。我寧願「選擇TOP 0(field1,field2,...)FROM myTable「並執行datareader作爲數據表。 – IAbstract 2010-09-18 22:37:46

6

謝謝你們,你讓我開始在正確的軌道上。我用下面的代碼找到了我的解決方案。然後我可以通過數據成員迭代和拉出它們各自的性質,例如名稱,類型等

var db = new GMPDataContext(); 
var columnNames = db.Mapping.MappingSource 
        .GetModel(typeof(GMPDataContext)) 
        .GetMetaType(typeof(Project)) 
        .DataMembers; 
+0

太棒了...我會用這個的。 – IAbstract 2010-09-18 22:39:39

+0

我剛剛翻譯成VB.NET並且工作。如果有人想在VB中使用:myData.Mapping.MappingSource()。GetModel(GetType(NameOfYourDataContextObject))。GetMetaType(GetType (TableObjectFromDataContext).DataMembers – bernie2436 2011-12-16 18:24:39

15

這將是很好有作爲一個擴展方法:

public static class LinqExtensions 
{ 
    public static ReadOnlyCollection<MetaDataMember> ColumnNames<TEntity> (this DataContext source) 
    { 
     return source.Mapping.MappingSource.GetModel (typeof (DataContext)).GetMetaType (typeof (TEntity)).DataMembers; 
    } 
} 

例如:

var columnNames = myDataContext.ColumnNames<Orders>(); 
+0

這是一個更好的解決方案t韓使用反射。 :) – IAbstract 2010-09-18 22:39:15

2

使用Todd Smiths(+1)解決方案,您可以獲得所有屬性(包括實體集等)。 過濾掉所有非列的屬性,這將這樣的伎倆:

var columnNames = db.ColumnNames<Orders>().Where(n => n.Member.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).FirstOrDefault() != null).Select(n => n.Name); 
0

這裏的另一種方式:

 public string[] GetColumnNames() 
     { 
      var propnames = GetPropertyNames(_context.Users); 
      return propnames.ToArray(); 
     } 

     static IEnumerable<string> GetPropertyNames<T>(IEnumerable<T> lst) 
     { 
      foreach (var pi in typeof(T).GetProperties()) 
      { 
       yield return pi.Name; 
      } 
     }