我正在尝试做一个OR。我以为你可以用Predicate做到这一点,所以我尝试了这个
var products = ctx.Products.Where(x => .....);
var predicate = PredicateBuilder.False<Product>();
foreach (Category categ in categs)
predicate = predicate.Or(p => p.Categories.Select(c => c.Id).Contains(categ.Id)
|| p.Categories.Select(c => c.Category1.Id).Contains(categ.Id)
|| p.Categories.Select(c => c.Category1.Category1.Id).Contains(categ.Id));
products = products.Where(predicate);
但它给了我这个错误
System.NotSupportedException:LINQ to Entities不支持LINQ表达式节点类型“Invoke”。
有人可以帮我解决这个问题吗?谢谢你提前。
Product
可以有一个或多个Category
Category
可能有一个名为Category1
的“父类别”。上面的长3行是选择一个类别或其子类别下的产品。
我用Google搜索并找到了LinqKit,但我想避免为此添加第三方。但是,如果我必须使用LinqKit,是否易于安装?
答案 0 :(得分:0)
我认为这有效
if (categs.Length > 0)
{
List<Product> tmpProducts = new List<Product>();
foreach (Category c in categs)
{
var tmp = ctx.Products.ToList().Where(x => x.IsUnderCategory(c));
tmpProducts = tmpProducts.Union(tmp).ToList();
}
products = products.ToList().Intersect(tmpProducts).AsQueryable();
}
IsUnderCategory是一个扩展名
public partial class Category
{
public bool IsUnderCategory(Category categ)
{
if (Id == categ.Id) return true; // is itself
if (Parent == null)
return false;
return Parent.IsUnderCategory(categ);
}
}