InnerJoin vs Contains,速度更快

时间:2015-09-18 10:54:08

标签: c# sql linq

我正在编写查询以使用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);

我知道在两个查询中都会在服务器端进行计算以匹配记录。

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

1 个答案:

答案 0 :(得分:0)

我会说查询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以生成第二个表,因此存在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/