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

本文关键字:类型 实体 支持 枚举 包含时 查询 Linq 框架 列表 出错 | 更新日期: 2023-09-27 17:56:36

我有很多这样的查询,但我无法弄清楚为什么这个查询出错。当我进行空检查然后使用 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 类型的列表。

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

如果它不喜欢空检查,并且您需要它是可选的,则可以执行以下操作:

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)) &&

如果你的产品类别ID不是可空整数的IEnumerable,你可以做与部分相同的操作。(真的不明白需要如何支持它而不是 int 列表)