我正在编写查询以使用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);
我知道在两个查询中都会在服务器端进行计算以匹配记录。
那么哪个查询适合更快的执行?
答案 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/