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