2012-02-22 30 views
0

我有這樣的方法:「無法創建類型的常量值。」如何在LINQ查詢中避免此錯誤?

public virtual IEnumerable<Invoice> GetHomePageInvoices(IList<Area> areas, FinancialYearLookup financialYear) 
{ 
    var homePageInvoices = _db.Invoices.Where(x => areas.Any(z => z.Id == 3)).ToList(); 

    ... 
} 

基本上我試圖找到其中面積在使用這些參數區域的匹配任何發票。

,我發現了錯誤:

Unable to create a constant value of type 'Models.Area'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

任何人都可以解釋爲什麼發生這種情況,以及如何解決?

+3

您使用的是LINQ提供程序? LINQ to SQL? LINQ to Entities?還有別的嗎? – svick 2012-02-22 23:37:51

+0

Linq to Entities – AnonyMouse 2012-02-22 23:52:06

回答

5

你不能在你的LINQ提供程序(可能是LINQ到實體)的上下文中使用的IList<Area> - 剛剛提取的ID事先並使用Contains查詢其確實對原語的採集工作:

List<int> ids = areas.Select(x=> x.Id).ToList(); 
var homePageInvoices = _db.Invoices 
          .Where(x => ids.Contains(x.Id)) 
          .ToList(); 

而且我假設你不想與固定值3比較 - 所以我相應地更改了你的查詢 - 只要Invoice實體具有Id屬性。

0

a。它看起來像你在這裏有一個錯字:

z => z.Id == 3 

但主要問題是 灣我猜你正在使用Linq to Entities,但不清楚。在任何情況下,發生的事情是,查詢生成器試圖將'areas.Any(...)'轉換爲SQL,但它不能這樣做,因爲區域不是數據庫中的IQueryable,而是局部變量。我建議你使用像這樣的WhereIn自定義Linq運算符,如herehere所述。這將構建一個SQL in子句,其中包含您可能想要匹配的區域中的所有項目。

相關問題