[英]Filter / Remove EF5 Navigation properties with reflection
我有以下代碼來獲取傳入的通用實體的所有屬性。我認為此類屬性將非常適合Excel報告。 但是當我使用它時,我得到了一堆“導航”屬性。 我想過濾掉它們,因為它們弄亂了報告。 這是一些代碼...
DataTable dataTable = new DataTable(typeof(TEntity).Name);
//Get properties / field names
PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);
//Add props to datatable
foreach (PropertyInfo prop in Props)
dataTable.Columns.Add(prop.Name);
因此,代碼繼續將其他行添加到數據表中,然后將其用於將數據發送到出色的NPOI免費excel導出工具。
理想情況下是否存在BindingFlags屬性,該屬性使我可以忽略以下內容
| !BindingFlags.Navigation
我也不需要其他兩個,因為無論使用或不使用它們,我都會得到相同的細節。
如果沒有BindingFlags屬性,有沒有一種方法可以擴展它。
如果沒有,那么還有其他一些標准方法可以可靠地檢測到它們,以便我將其過濾掉。
我聽說其中一些包含“ Navigation”作為前綴,或者幾乎總是虛擬的,但是盡管我的似乎都是虛擬的,但“幾乎”部分讓我感到擔憂。 這就是為什么我不想做類似的事情:
PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => !p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal).ToArray();
但是我沒有我可以看到的“ Navigation”前綴,但是如果他們這樣做,我也不相信這會給我正確的方法。
也許我對以上兩個是錯誤的,或者找不到合適的地方。
我還按照生成“ ViewModel”的方式完成了一些工作,這些“ ViewModel”連接到存儲庫以從模型中獲取數據並填充ViewModel。 然后將其發送到我的報告引擎中。 這似乎更加靈活,因為如果將視圖附加到視圖上,就可以像預覽一樣使用它。 這聽起來像正確的方法嗎?
提前致謝...
正如弗朗西斯(Francis)所建議的那樣,您可以使用DbContext的元數據(如下所示)來獲取給定實體類型的導航屬性:
public static PropertyInfo[] GetNavigationProperties<TEntity>(DbContext context)
where TEntity: class
{
var objContext = ((IObjectContextAdapter)context).ObjectContext;
var elementType = objContext.CreateObjectSet<TEntity>().EntitySet.ElementType;
return elementType.NavigationProperties.Select(prop => typeof(TEntity).GetProperty(prop.Name)).ToArray();
}
然后,您可以過濾屬性,排除導航屬性,然后代碼可能是這樣的:
var dataTable = new DataTable(typeof(TEntity).Name);
var navProperties = GetNavigationProperties<TEntity>(ctx);
var props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);
//Add props to datatable
foreach (var prop in props.Except(navProperties))
dataTable.Columns.Add(prop.Name);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.