C# EF:如何处理多对多关系(涉及一些过滤)

C# EF:如何处理多对多关系(涉及一些过滤),c#,entity-framework,lambda,many-to-many,linq,C#,Entity Framework,Lambda,Many To Many,Linq,我是EF和LINQ的初学者,我想按产品id检索类别列表(带过滤器) 因此,我在产品**类别之间有多对多关系,我使用以下代码: var categList = dbContext.Products .Where(prod => prod.PROD_UID == 1234) .SelectMany(prod => prod.Categories) .Distinct(); categL

我是EF和LINQ的初学者,我想按产品id检索类别列表(带过滤器)

因此,我在
产品**类别
之间有多对多关系,我使用以下代码:

var categList = dbContext.Products
                 .Where(prod => prod.PROD_UID == 1234)
                 .SelectMany(prod => prod.Categories)
                 .Distinct();

categList = SearchCategories(filter, categList);
categList = SortCategories(filter, categList);
categList = PageCategories(filter, categList);
其中
SearchCategories
用于重用一些代码,如下所示

IQueryable<Category> SearchCategories(MyFilter filter, IQueryable<Category> source = null)
{
    source = source ?? this.dbContext.Categories;

    return source.Where(cat => [...filtering...] );
}
我如何筛选
SelectMany
中的类别


谢谢大家!

你的问题是你把服务器查询和客户端查询混淆了,这里没有魔力

您的第一个查询,直到Distinct被序列化并发送到服务器,然后服务器发送响应,然后您在客户机中运行筛选器

当您将
SearchCategories
放入服务器查询时,它不能是解析器,因此您会得到错误

这里有两个选项:

1:只需在第一个查询中写入
SearchCategories
中的所有查询,使其在服务器上运行即可

 .SelectMany(prod => prod.Categories.Where(c => [...filtering...]))
记住过滤不能调用客户端代码


2:你放了一个ToList或ToArray,然后使用
SearchCategories
,但这个选项不会优化任何东西。

我想你的代码中有一个打字错误,你不能有。选择你应该有的many(cat=>prod.Categories)。选择many(prod=>prod.Categories)。要正确地做到这一点。。。我创建“SearchCategories”函数的想法是重用过滤代码。一般来说,在创建lambda表达式时,我应该忘记这一点吗?也许我必须找到一种方法来构建一个“表达式”来重用这里的代码,但我在这方面是个初学者
 .SelectMany(prod => prod.Categories.Where(c => [...filtering...]))