我有这行代码:
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_ID
和Master_Session_ID
。该表有10条记录,其中5条记录为Master_Session_ID = 14
,5条记录为Master_Session_ID = 1
。 Since 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?
答案 0 :(得分:0)
如果您在下一个Order_ID
参数Select
中按s
分组,Key
具有相同Order_ID
的字符串,则您的示例中的逻辑错误你的情况。
因此,当您在select中调用Key.Count()
时,它会返回字符串长度
所以你需要改变
s.Key.Count()
到
s.Count()
<强>更新强>
您的解决方案适用于IQueryable
因为它首先生成像
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来处理它们。