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);
我知道,在这两个查询计算将在服务器端完成匹配记录。
那么哪个查询适合更快地执行?
我想说查询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/