InnerJoin vs Contains,后者更快

本文关键字:vs Contains InnerJoin | 更新日期: 2023-09-27 18:13:14

我正在编写查询,以查找使用linq从数据库的整数值的总和。在开发过程中,我有两个想法。我可以通过包含或内连接来实现。以下是查询

var Customer = db.tbl_User_to_CustomerMast.Where(i => i.fk_Store_ID == s.ShopID).ToList();

查询1:

var RewardCount = db.tbl_RewardAwardMast.Where(i => Customer.Select(j => j.User_Customer_ID).ToList().Contains(i.fk_Customer_UserID.Value)).Sum(i => i.RewardPoints).GetValueOrDefault(0);
查询2:

var RewardCount = Customer.Join(db.tbl_RewardAwardMast, i => i.User_Customer_ID, j => j.fk_Customer_UserID, (i, j) => new { Customer = i, Reward = j }).Sum(i=>i.Reward.RewardPoints).GetValueOrDefault(0);

我知道,在这两个查询计算将在服务器端完成匹配记录。

那么哪个查询适合更快地执行?

InnerJoin vs Contains,后者更快

我想说查询1将更快,因为它将被翻译成简单的SQL,类似于:

SELECT SUM(RewardPoints)
FROM User_to_CustomerMast
WHERE fk_Customer_UserID IN (c1,c2,c3,c4,c5,...,cx)

查询2可能会慢一些,因为您实际上是在尝试将本地列表变量与DB中的数据连接起来。这个列表最初来自DB并不重要,当执行ToList()时,与DB的关联就丢失了。要执行这样的查询,需要将必要的信息传递给DB以生成第二个表,这样就有东西可以用来JOIN现有表。这将使用UNION来完成。

SELECT SUM(RewardPoints)
FROM 
    User_to_CustomerMast INNER JOIN
    (
         SELECT c1
         UNION 
         SELECT c2
         UNION 
         SELECT c3
         UNION 
         SELECT c4
         UNION 
         SELECT c5
         UNION 
         ...
         ...
         SELECT cx
     ) AS T ON T.Id = fk_Customer_UserID 

可以看到,当本地列表增长时,查询扩展得很快。如果你的列表太长,在某一点上,你甚至可能得到异常,SQL太复杂。

你可以在这里看到关于这个话题的详细分析:http://blog.hompus.nl/2010/08/26/joining-an-iqueryable-with-an-ienumerable/