0

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

所以,我之间有多对多的关系Product * <---> * Category,我使用以下代码:

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

whereSearchCategories用于重用一些代码,如下所示

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

    return source.Where(cat => [...filtering...] );
}

虽然这看起来不错,但我想对其进行稍微优化,在内部过滤SelectMany(利用SearchCategoriesinside SelectMany)......但我无法让它工作。我试过这个,但给了我错误

var categList = dbContext.Products
                 .Where(prod => prod.PROD_UID == 1234)
                 .SelectMany(cat => SearchCategories(filter, prod.Categories.AsQueryable()).AsEnumerable());

// throws LINQ to Entities does not recognize the method 'SearchCategories'

我如何过滤里面的类别SelectMany

谢谢!

4

1 回答 1

1

您的问题是您将服务器查询与客户端查询混淆了,这里没有魔法。

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

当您将其SearchCategories放入服务器查询中时,它不能成为解析器,因此您会收到错误消息。

你有两个选择:

1:只需SearchCategories在第一个查询中编写所有查询,使其在服务器中运行

 .SelectMany(prod => prod.Categories.Where(c => [...filtering...]))

记住过滤不能调用客户端代码。

2:您放置一个 ToList 或 ToArray 然后使用,SearchCategories但此选项不会优化任何内容。

于 2013-08-20T08:41:36.220 回答