实体框架Linq查询到列表 - 使用包含时出错:仅支持基本类型,枚举类型和实体类型

时间:2015-06-15 19:43:22

标签: c# .net linq entity-framework

我有很多像这样的查询,但我无法弄清楚为什么这个错误。当我进行空检查然后使用Contains时,似乎它与我的where子句的部分有关。

我得到的错误是:

  

无法比较类型的元素' System.Collections.Generic.IEnumerable`1 [[System.Nullable`1 [[System.Int32,mscorlib,Version = 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);

我也试过传入一个int类型的List。

1 个答案:

答案 0 :(得分:3)

如果它不喜欢空检查并且你需要它是可选的,你可以这样做:

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不是IEnumerable的可以为空的int,那么你可以对section进行相同的操作。 (不要真正理解如何支持它而不是int列表)