【发布时间】:2021-09-27 12:40:54
【问题描述】:
我这里有一些工作代码,但我真的担心它效率不高 - 但我想不出改进它的方法。有什么想法吗?
我们有IQueryable<Users> users,它从用户表中获取数据,实体框架将每个用户映射到单独的组织表,这是一对多的关系。我们还有一个List<string> orgCriteria,这是我们要过滤用户的组织列表。本质上,我们希望获得在条件中的任何组织中具有成员资格的用户列表。
要将用户的组织名称与过滤条件中的组织进行比较,我们必须使用一些 linq/EF 映射,如下所示:var x = users.Select(x => x.Orgs.Name).ToList(); 但是,显示名称是我们从条件中得到的,这意味着我们还必须将部分名称转换为显示名称...
这些是涉及到所有这些的表:User、Orgs、UserOrgs。用户对Orgs 的Id 有一个FK,UserOrgs 有3 列:Id、UserId、OrgId 其中UserId 和OrgId 是它们各自表的FK。一个用户可以有 0 个或与 Orgs 一样多。每个组织都有一个名称,但我们通常在域模型中映射的显示名称由三列组成:name、foo 和bar,其中bar 是可空列。
我尝试了这样的相交,但它不起作用:users = users.Where(x => x.Select(y => string.Format("{0} - {1}{2}", y.Org.Name, y.Org.foo, y.Org.bar != null ? " - " + y.Org.bar : string.Empty)).Intersect(orgCriteria).Any()); 因为我收到此错误:
在查询的 LINQ to SQL 实现中不能使用本地序列 除包含运算符之外的运算符。
所以我可以通过结合 foreach 和 intersect 使其工作,但我担心...如果我们有 500 个用户,每个用户有 20 个组织,这似乎是一个非常昂贵的过滤器。
这种方式行得通,但让我很紧张:
foreach(var user in users)
{
List<string> userOrgNames = user.Orgs.Select(x => string.Format("{0} - {1}{2}", y.Org.Name, y.Org.foo, y.Org.bar != null ? " - " + y.Org.bar : string.Empty)).ToList();
if (!userOrgNames.Intersect(orgCriteria).Any())
users = users.Where(x => x.Id != user.Id);
}
有什么想法吗?
【问题讨论】:
-
请显示两组数据的文本或视觉表示,以及预期的结果。我不明白这个问题 - 显示输入和预期输出可能有助于我的弱脑。
-
将整个列表作为单个表参数传递,不确定它是否在 EF 中得到适当支持,请参阅stackoverflow.com/questions/8157345/…,除非 XML、JSON 或 CSV 可能是前进的方向,因为它只是一个简单的字符串列表
-
或者我在这里误解了一些东西:你为什么需要
ToList,为什么你需要foreach,如果所有数据都是服务器端的,那么构建一个完整的LINQ查询到得到你想要的 -
我添加了一个图表,希望能帮助我们直观地了解正在发生的事情!
标签: c# sql asp.net linq entity-framework-4