繁体   English   中英

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

[英]EF: how to tackle many-to-many relation (some filtering involved)

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

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

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

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

尽管这看起来还可以,但我希望对其进行一些优化,在SelectMany内进行过滤(利用SelectMany内的SearchCategories )...但是我无法使其工作。 我试过了,但是给我错误

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的类别?

谢谢!

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

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

当您将SearchCategories放入服务器查询中时,它无法解析,因此会收到错误消息。

您在这里有两个选择:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM