2016-11-14 37 views
0

我想爲EF使用自定義框架,但我有一個我不明白的問題。錯誤在下面。這似乎很明顯,但我不知道如何解決它實體框架,包含路徑表達式必須引用在類型上定義的導航屬性

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties. 

參數名稱:路徑

我調用這個函數,它拋出上述異常。

_menuRepository.GetAll(d => d.DateToDisplay <= DateTime.Today).OrderByDescending(d=>d.Id).Take(100).ToList(); 

和GetAll()函數如下所示。

public virtual IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties) 
{ 
    List<T> list; 
    using (var context = new DBEntities()) 
    { 
     IQueryable<T> dbQuery = context.Set<T>(); 

     //Apply eager loading 
     foreach (Expression<Func<T, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include<T, object>(navigationProperty); //**** It throws the exception here 

     list = dbQuery 
      .AsNoTracking() 
      .ToList<T>(); 
    } 
    return list; 
} 

我做錯了什麼?我怎樣才能解決這個問題?

+2

我無法直接回答您的問題,但請注意,以這種方式使用EF會導致'OrderByDescending()'和'Take()'子句對內存中的記錄執行這些操作,而不是SQL正在從'GetAll()'方法返回'List '。意思是,如果您有10,000條記錄,您當前的方法將向您的應用程序發送10,000條記錄,然後在該應用程序中進行排序並取得其中的100條記錄。爲了防止,您希望將'.OrderBy'和'.Take()'語句應用於EF上下文查詢**在**之前調用'ToList()'。 – Tommy

+1

@Tommy,我明白你的意思了,我會照顧的。我怎麼才能像使用SQL一樣使用命令,然後將所有內容都放入內存中 –

+1

只要可以肯定,你想要的是'Include'?而不是'Where'?因爲當你調用'GetAll'時,你似乎想要應用一個過濾器。 –

回答

1

EF中的表達式預計是一個lambda,它將檢索對象的屬性。在您的例子

d => d.DateToDisplay <= DateTime.Today 

謂語 - 它的計算結果爲布爾值:這就是爲什麼包括不能確定哪個屬性爲「有」。

我想你已經感到困惑包括一個LINQ Where Clase。顯然,這應該工作:

_menuRepository.GetAll(d => d.DateToDisplay).OrderByDescending(d=>d.Id).Take(100).ToList(); 

如果只有T型擁有財產DateToDisplay

+0

非常感謝,但它說:「指定的Include路徑無效。EntityType'DBModel.Menu'沒有聲明名爲'DateToDisplay'的導航屬性。」 –

+0

@ayilmaz:'GetAll(d => d.DateToDisplay)'在你的情況下不需要。 –

+0

@ayilmaz這就是我的意思,「如果只有類型T有屬性DateToDisplay」。讓我改述一下:'包括'是什麼 - 它'加載'由給定表達式指定的屬性的內容(在我發佈的示例中,它將是DateToDisplay)。如果你的數據模型(比如說T)沒有名爲'DateToDisplay'的公共屬性,這將不起作用。但是,如果一個實體沒有特定的屬性,那麼就沒有必要加載它。如果您描述了您想通過GetAll方法實現的目標,我們可能會爲您提供更詳細的解決方案。 –