Gir*_*hel 8 c# sql-server lambda linq-to-entities entity-framework
我使用Linq实体来查询数据库以获取int列表以供进一步处理.我有两种方法可以获得如下列表:
首先是:
List<int> lstBizIds = new List<int>() { 1, 2, 3, 4, 5 };
List<int> lstProjectIds = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
Run Code Online (Sandbox Code Playgroud)
第二是:
List<int> lstBizIds = new List<int>() { 1, 2, 3, 4, 5 };
List<int> lstProjectIds = context.Projects.Join(lstBizIds, p => p.businessId, u => u, (p, u) => p.projectId).ToList();
Run Code Online (Sandbox Code Playgroud)
现在我的问题是上面哪种方法更好的表现?如果第一个列表即lstBizIds的大小增加,它是否也会影响性能?如果性能降低,建议我实施其他方法.
您应该使用Contains
,因为EF可以产生更有效的查询。
这将是SQL连接:
SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item
Run Code Online (Sandbox Code Playgroud)
这将是SQL包含的内容:
SELECT Id
FROM Projects
WHERE UserId IN (1, 2, 3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
IN
比JOIN
DBMS可以停止寻找的第一个匹配项更有效IN
;JOIN
即使在第一场比赛之后,总会结束。
您可能还需要检查哪些查询实际上已发送到数据库。您总是必须比较SQL,而不是LINQ代码(显然)。
执行联接非常高效,因为Where条件实际上执行所有表的笛卡尔积,然后过滤满足条件的行。这意味着对每个行组合 (n1 * n2 * n3 * n4) 评估Where 条件
Join 运算符从第一个表中获取行,然后仅从第二个表中获取具有匹配键的行,然后仅从第三个表中获取具有匹配键的行,依此类推。其次,contains 将以迭代方式工作,使其比 join 慢