【发布时间】:2013-09-11 14:17:55
【问题描述】:
这是this问题的后续。
TLDR:
问题:
我想过滤一个查询,只保留每个唯一 ID 的前 n 行。
答案:
query = query.GroupBy(q => q.ID).SelectMany(g => g.Take(n));
这个答案的问题在于,对于超过 80,000 行,评估查询比通过迭代过滤 (foreach) 花费的时间要长得多(至少慢两倍)。查看此答案生成的 SQL,使用了 CROSS APPLY,最有可能用于 SelectMany()。
This link 描述了CROSS APPLY 的作用:
APPLY 运算符允许您连接两个表表达式;每次从左表表达式开始,每行都会处理右表表达式。
简而言之,我正在寻找一个过滤查询,它可以有效地为每个唯一的 ID 收集顶部的 N 行。
具有解释性 SQL 的 Linq 解决方案将是理想的。
【问题讨论】:
-
另一种实现最大 n 每组查询的常用方法是
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Y)然后对其进行过滤。不确定 linq-to-sql 是否可以生成该 SQL。 -
当然这种过滤方式比不使用过滤需要更多
calculations,所以效率下降是可以理解的。 -
编辑了我的问题。很抱歉造成混乱。
标签: c# sql linq linq-to-sql