2012-09-05 52 views
5

這使我今天沒有問題的結束。我有這個簡單的查詢實體框架:無法創建類型'System.Collections.Generic.IList`1的常量值'

var result = 
    DataContext.Accommodations.Where(a => 
     (criteria.MinPrice == null || a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && 
     (criteria.MaxPrice == null || a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice)) && 
     (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 
); 

此查詢的最後一行是造成我的問題

(criteria.Locations == null || 
criteria.Locations.Count == 0 || 
a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 

它給人的錯誤

無法創建 類型的恆定值「 System.Collections.Generic.IList`1' 。在此上下文中僅支持基本類型(如' Int32,String和Guid')。

我甚至沒有試圖創建一個列表。我在這裏要做的所有事情都是帶回與某個地點相關的住宿(地點表中通過AccommodationPlaceJoin錶鏈接到住宿表的地點名稱)與標準中的任何一個地名相同.Locations(屬於IList類型)。

我試着改變這一行,但它沒有奏效。

(criteria.Locations == null || 
criteria.Locations.Count == 0 || 
a.AccommodationPlaceJoins.Any(j => criteria.Locations.Any(l => l == j.Place.PlaceName))) 

回答

29

恆定值EF不能創建是null用於比較criteria.Locations == null。您需要查詢分成兩個案件做查詢外空單的檢查,例如像這樣:

BTW

var result = DataContext.Accommodations.Where(a => 
    (criteria.MinPrice == null || 
     a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && 
    (criteria.MaxPrice == null || 
     a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice))); 

if (criteria.Locations != null && criteria.Locations.Count > 0) 
{ 
    result = result.Where(a => a.AccommodationPlaceJoins 
     .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); 
} 

編輯:撰寫整個查詢將使它在我看來更好的可讀性,並且將簡化必須發送到數據庫的SQL:

IQueryable<Accommodation> result = DataContext.Accommodations; 

if (criteria.MinPrice != null) 
    result = result.Where(a => a.AccommodationRates 
     .Any(r => r.From >= criteria.MinPrice)); 

if (criteria.MaxPrice != null) 
    result = result.Where(a => a.AccommodationRates 
     .Any(r => r.To <= criteria.MaxPrice)); 

if (criteria.Locations != null && criteria.Locations.Count > 0) 
    result = result.Where(a => a.AccommodationPlaceJoins 
     .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); 
+0

哇,好的答案。太感謝了。我遇到了很多錯誤的調查。感謝+1並接受了答案和最喜歡的問題。難怪你有近29K點。爲什麼這會發生呢? –

+0

我正在重構符合您的可讀性建議。謝謝。 –

+1

@SachinKainth:發生異常是因爲在LINQ to Entities中,查詢中的每個表達式和表達式片段必須可以轉換爲SQL。比較'criteria.Locations == null'不會在客戶端(= .NET)上執行,而是EF想要將它翻譯成SQL,然後數據庫應該執行比較。但是數據庫不知道如何比較.NET/CLR對象引用,它只能檢查'NULL'等字符串類型,int等。沒有翻譯成SQL可能或支持 - >例外。 – Slauma

相關問題