Linq与GroupBy和Count的结果不同

时间:2013-12-25 17:07:33

标签: c# sql linq

我有这行代码:

IQueryable<AZ_Return_R> fistSet = myDb.AZ_Return_Rs.Where(w => w.Master_Session_ID == 14);
List<AZ_Return_R> secondSet = myDb.AZ_Return_Rs.Where(w => w.Master_Session_ID == 14).ToList();

var res1 = fistSet.GroupBy(g => g.Order_ID).Select(s => new { orderId = s.Key, count = s.Key.Count()});
var res2 = secondSet.GroupBy(g => g.Order_ID).Select(s => new {orderId = s.Key, count = s.Key.Count()});

其中AZ_Return_R是包含2列的表格:Order_IDMaster_Session_ID。该表有10条记录,其中5条记录为Master_Session_ID = 14,5条记录为Master_Session_ID = 1Since Order_ID在表中是唯一的,我认为res1和res2必须返回5条记录,所有记录都是Count = 1,insted res1是正确的,res2返回5条记录,但是Count = 19 !!! 哪里我错了?

修改

我发现如果我写:

var res3 = secondSet.GroupBy(g => g.Order_ID).Select(s => new { orderId = s.Key, count = s.Count() });

结果是正确的,为什么使用List&lt;&gt;我必须使用s.Count和IQueryable&lt;&gt;必须使用s.Key.Count?

1 个答案:

答案 0 :(得分:0)

如果您在下一个Order_ID参数Select中按s分组,Key具有相同Order_ID的字符串,则您的示例中的逻辑错误你的情况。
因此,当您在select中调用Key.Count()时,它会返回字符串长度

所以你需要改变

s.Key.Count()

s.Count()

<强>更新

您的解决方案适用于IQueryable因为它首先生成像

这样的sql脚本
SELECT COUNT(*) AS [count], [t0].[Order_ID] AS [orderId]
FROM [dbo].[TestTable] AS [t0]
WHERE [t0].[Master_session_ID ] = @p0
GROUP BY [t0].[Order_ID]

并在测试结果时执行它。如您所见,此sql返回正确的值

如果IEnumerable您首先获得所有项目,然后使用Linq-to-Objects来处理它们。