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,安装起来容易吗?

Entify Framework如何在哪里或使用Linq(谓词)

我认为这适用于

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);
    }
  }