【发布时间】:2021-11-27 16:45:45
【问题描述】:
我有一个实体 Person,它有一个与之关联的位置列表。我需要查询人员表并从位置列表(条件)中获取所有至少具有一个位置的人。以下方法有效,但效率极低:
var searchIds = new List<int>{1,2,3,4,5};
var result = persons.Where(p => p.Locations.Any(l => searchIds.Any(id => l.Id == id)));
这适用于小型列表(例如 5-10 个 searchIds 和一个有 5-10 个位置的人。问题是有些人可能有 100 个位置,而一次搜索也可以搜索 100 个位置。当我尝试执行上面的EF实际上产生了一个2000+的SQL语句并且因为嵌套太深而失败了。虽然嵌套本身已经是一个问题,即使它可以工作,我仍然不会遇到2000+的SQL语句.
注意:实际代码还包括多个级别和父子关系,但我确实设法将其简化为仅使用 id 而不是完整对象的相当扁平的结构
在 EF 中实现此目的的最佳方法是什么?
【问题讨论】:
-
获取2000+ sql时传递了多少个id?
-
对于那些使用 EF Core 3.1+ 的人,这提供了一个解决这个问题的方法:stackoverflow.com/a/70587979/2206145
标签: c# database linq entity-framework