gpt4 book ai didi

c# - 性能 : . Join 与 .Contains - Linq to Entities

转载 作者:太空狗 更新时间:2023-10-29 19:38:29 24 4
gpt4 key购买 nike

我正在使用 Linq to entities 查询数据库以获取 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();

第二个是:

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

现在我的问题是,上述哪一种方法的性能更好?如果第一个列表即 lstBizIds 的大小增加,它也会影响性能吗?如果会降低性能,请给我建议其他实现方式。

最佳答案

您应该使用 Contains,因为 EF 可以生成更高效的查询。

这将是 SQL 连接:

SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item

这将是 SQL 包含:

SELECT Id
FROM Projects
WHERE UserId IN (1, 2, 3, 4, 5, 6)

INJOIN 更有效,因为 DBMS 可以在 IN 的第一个匹配项之后停止查找; JOIN 总是完成,即使是在第一次匹配之后。

您可能还想检查哪些查询实际发送到数据库。您总是必须比较 SQL,而不是 LINQ 代码(很明显)。

关于c# - 性能 : . Join 与 .Contains - Linq to Entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40650720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com