C# 实体化框架如何在何处或使用Linq(谓词)

C# 实体化框架如何在何处或使用Linq(谓词),c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我想做一个手术室。我想你可以用谓词来做这个,所以我试了这个 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

我想做一个手术室。我想你可以用谓词来做这个,所以我试了这个

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);
var products=ctx.products.Where(x=>…);
var predicate=PredicateBuilder.False();
foreach(类别中的类别)
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.categori1.categori1.Id).Contains(categ.Id));
products=products.Where(谓词);
但它给了我这个错误

System.NotSupportedException:LINQ to实体中不支持LINQ表达式节点类型“Invoke”

有人能帮我解决这个问题吗?提前谢谢

产品
可以有一个或多个
类别

Category
可能有一个名为
Category1
的“父类别”。上面的三行是选择一个类别或其子类别下的产品

我在谷歌上搜索并找到了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();
}

结果SQL会是什么样子?Babcock,SQL查询太复杂了,但我添加了说明,应该会更清楚。谢谢
SQL查询太复杂了
-您确定有支持您期望的行为的SQL查询吗?我远非SQL专家,但在SQL中实现这一点的方法是使用
联合
将其分解为单独的查询。这可能是一种更简单的方法。所有类别(父类别和子类别)都在一个表中吗?它们是如何相互联系的?顺便说一句,您可以使用Any()代替Select().Contains().p=>p.Categories.Any(c=>c.Id==categ.Id)。您是否可以使用查看以获取任何级别上具有相关id的CategoryId的列表?您确定需要
ToList
?是的,否则tmpProducts将在最后一行之前为空,因此只有最后一个类别才有效。您是认真的吗?你在
categs
中为每个类别在内存中获取整个产品表,然后在另一个时间结束。我知道。这就是我发布这个问题的原因,想看看是否有一种有效的方法。最后,
产品
是经过过滤的产品,可能不是所有产品。
  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);
    }
  }