簡體   English   中英

使用反射過濾/刪除EF5導航屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM