我们有下表,将其命名为Products:
UserName ProductName SortOrder
--------------------------------------
U1 U1P1 2
U1 U1P2 3
U1 U1P3 5
U2 U2P1 1
U2 U2P2 2
U3 U3P1 4
UserName和ProductName可以是任何内容。每个UserName的SortOrder是增量的,但可以从任何索引开始,它们之间可能存在差距。
我需要一个以这种方式对数据进行排序的查询:
UserName ProductName SortOrder
--------------------------------------
U1 U1P1 2
U2 U2P1 1
U3 U3P1 4
U1 U1P2 3
U2 U2P2 2
U1 U1P3 5
添加每个用户的第一行,然后添加第二行,依此类推
我不确定这是否可以在Linq to Sql中完成。
另请注意,表中可能有10000行以上,因此性能非常重要。
答案 0 :(得分:2)
纯linq(即查询语法)?不是我所知道的。
LINQ到SQL?当然 - 感谢TSQL的支持:
var query = ctx.ExecuteQuery<Product>(@"
select x.UserName, x.ProductName, x.SortOrder
from (
select p.UserName, p.ProductName, p.SortOrder,
ROW_NUMBER() over (partition by p.UserName order by p.SortOrder)
as [Rank]
from Products p) x
order by x.[Rank], x.UserName, x.SortOrder");
与任何非平凡的查询一样,表的索引策略在这里可能很重要。您可能希望尝试跨越UserName
和SortOrder
的索引(衡量统计数据IO),然后将其删除并尝试跨越SortOrder
和UserName
的索引(反之亦然) ;再次,衡量统计数据-IO)。