2015-06-15 35 views
4

我有很多像這樣的查詢,但我不明白爲什麼這個錯誤。當我進行空檢查然後使用Contains時,似乎它與我的where子句的某些部分有關。實體框架Linq查詢列表 - 使用時出錯包含:僅支持基本類型,枚舉類型和實體類型

我得到的錯誤是:

無法比擬的類型元素「System.Collections.Generic.IEnumerable`1 [System.Nullable`1 [System.Int32,mscorlib程序,版本= 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'。只支持原始類型,枚舉類型和實體類型。

以及它拋出代碼:

public static IEnumerable<Product> GetProducts(int? productDepartmentId = null, int? productCategoryId = null, IEnumerable<int?> productCategoryIds = null, IEnumerable<string> sections = null) 
{ 
    using (var context = new AppContext()) 
    { 
     var retList = (from obj in context.Products 
         where (productDepartmentId == null || obj.ProductDepartmentId == productDepartmentId) && 
          (productCategoryId == null || obj.ProductCategoryId == productCategoryId) && 
          (productCategoryIds == null || productCategoryIds.Contains(obj.ProductCategoryId)) && 
          (sections == null || sections.Contains(obj.sections)) 
         select obj).ToList(); 
     return retList; 
    } 
} 

這些都是使得它的錯誤線。我相信,它不會像空校驗:

(productCategoryIds == null || productCategoryIds.Contains(obj.productCategoryIds)) && 
(sections == null || sections.Contains(obj.Section)) 

這裏是我的方法調用(部分沒有被通過):

List<int?> categoryIds = new List<Int?>; 
varList = ProductsDAL.GetProducts(productDepartmentId: productproductDeparmentId, 
            productCategoryId: productCategoryId, 
            productCategoryIds: categoryIds); 

我也試圖傳遞的List鍵入int。

+0

categoryIds和sections從哪裏來? – Hammerstein

+0

他們來自我的代碼。它們最終成爲逗號分隔的ID列表。我注意到這個問題肯定是由於where子句中有空檢查和包含的部分。 –

+0

可能重複[無法比較'System.Collections.Generic.ICollection'類型的元素1只支持原始類型,枚舉類型和實體類型](http://stackoverflow.com/questions/23937112/cannot-compare-元素類型 - 系統集合 - generic-icollection1-only-p) –

回答

2

如果它不喜歡空校驗,你需要它是可選的,你可以這樣做:

List<int> productCategoryIdsTemp = new List<int>(); 
if (productCategoryIds != null) { 
    productCategoryIdsTemp.AddRange(productCategoryIds.Where(id => id != null).Select(id => id.Value)); 
} 
if (sections = null) { 
    sections = new List<string>(); 
} 

,然後在Linq查詢使用這樣的:

(productCategoryIdsTemp.Count == 0 || productCategoryIdsTemp.Contains(obj.ProductCategoryId)) && 
(sections.Count == 0 || sections.Contains(obj.section)) && 

如果您的productCategoryIds不是可以爲null的可爲null的整數,您可以像部分一樣進行操作。 (真的不明白這是如何被支持的,而不是int列表)

+0

我改變它使用int列表,而仍然得到相同的確切的錯誤。 –

+1

它不能說完全相同的錯誤,因爲原始錯誤表示它不能使用IEnumerable的可爲空的int。如果你不再使用它,現在必須是一個不同的錯誤。 – Dacker

+0

我的意思是說,我仍然得到一個錯誤,說這在最後抱歉:只支持原始類型,枚舉類型和實體類型。我不知道該做什麼了。因爲EF自動生成基於它的產品分類,它可以與我的數據庫表的設置方式有任何關係。 productCategoryId是一個可爲空的int屬性,Section是一個字符串屬性。 –

相關問題