我期待獲得從模型返回的列名稱列表。任何人都知道如何做到這一點,任何幫助將不勝感激。如何從模型LINQ獲取列名?
示例代碼:
var project = db.Projects.Single(p => p.ProjectID.Equals(Id));
此代碼將返回項目對象,我怎麼會得到這個模型中的所有列名的列表。
謝謝
我期待獲得從模型返回的列名稱列表。任何人都知道如何做到這一點,任何幫助將不勝感激。如何從模型LINQ獲取列名?
示例代碼:
var project = db.Projects.Single(p => p.ProjectID.Equals(Id));
此代碼將返回項目對象,我怎麼會得到這個模型中的所有列名的列表。
謝謝
對不起,我沒有LINQ的工作經驗。
這完全基於查看MSDN。
DataContext
有一個Mapping
屬性,它返回一個MetaModel
的實例。
MetaModel
有GetMetaType
,需要Type
。在你的情況下,它可能是typeof(Project)
。
GetMetaType
返回一個MetaType
其中有GetDataMember
方法,其中需要MemberInfo
參數。您將不得不在Projects
對象上使用反射來獲取MemberInfo
對象。
MetaDataMember
由GetDataMember
返回的實例應該擁有所有你需要的東西。
我希望我有些在正確的方向(純粹看MSDN &穿越)
您的列應該被映射爲項目模型中的屬性。我不確定在使用LINQ to SQL時是否可以獲得底層數據庫結構。 LINQ to SQL的全部要點是將數據庫抽象出來。
您的項目包裝將有一組屬性,每個屬性都有一個[Column]屬性。所以只需使用反射來枚舉具有該屬性的屬性即可。
我不明白爲什麼這麼多的解決方案,使用反射。 Scott Gu將IQueryable轉換爲DataTable的解決方案使用反射從TableAttribute裝飾的表實體中構建模式。我寧願「選擇TOP 0(field1,field2,...)FROM myTable「並執行datareader作爲數據表。 – IAbstract 2010-09-18 22:37:46
謝謝你們,你讓我開始在正確的軌道上。我用下面的代碼找到了我的解決方案。然後我可以通過數據成員迭代和拉出它們各自的性質,例如名稱,類型等
var db = new GMPDataContext();
var columnNames = db.Mapping.MappingSource
.GetModel(typeof(GMPDataContext))
.GetMetaType(typeof(Project))
.DataMembers;
太棒了...我會用這個的。 – IAbstract 2010-09-18 22:39:39
我剛剛翻譯成VB.NET並且工作。如果有人想在VB中使用:myData.Mapping.MappingSource()。GetModel(GetType(NameOfYourDataContextObject))。GetMetaType(GetType (TableObjectFromDataContext).DataMembers – bernie2436 2011-12-16 18:24:39
這將是很好有作爲一個擴展方法:
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>();
這是一個更好的解決方案t韓使用反射。 :) – IAbstract 2010-09-18 22:39:15
使用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);
這裏的另一種方式:
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;
}
}
除了`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