Entify Framework如何在哪里或使用Linq(谓词)
本文关键字:Linq 谓词 Framework 在哪里 Entify | 更新日期: 2023-09-27 18:24:51
我正在尝试执行OR。我以为你可以用谓词来做这件事,所以我尝试了这个
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"。
有人能帮我解决这个问题吗?提前感谢。
CCD_ 1可以具有一个或多个CCD_Category
可能具有一个称为Category1
的"父类别"。上面的3行是在一个类别或其子类别下选择产品。
我在谷歌上搜索并找到了LinqKit,但我想避免仅仅为此添加第三方。但如果我必须使用LinqKit,安装起来容易吗?
我认为这适用于
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);
}
}