C# Linq to Sql:选择带有自定义订单的查询
下表列出了it产品名称:C# Linq to Sql:选择带有自定义订单的查询,c#,linq-to-sql,C#,Linq To Sql,下表列出了it产品名称: UserName ProductName SortOrder -------------------------------------- U1 U1P1 2 U1 U1P2 3 U1 U1P3 5 U2 U2P1 1 U2 U2P2
UserName ProductName SortOrder
--------------------------------------
U1 U1P1 2
U1 U1P2 3
U1 U1P3 5
U2 U2P1 1
U2 U2P2 2
U3 U3P1 4
用户名和产品名称可以是任何内容。每个用户名的排序器都是增量的,但可以从任何索引开始,它们之间可能会有间隙。
我需要一个这样对数据排序的查询:
UserName ProductName SortOrder
--------------------------------------
U1 U1P1 2
U2 U2P1 1
U3 U3P1 4
U1 U1P2 3
U2 U2P2 2
U1 U1P3 5
添加每个用户的第一行,然后添加第二行,依此类推。
我不确定这是否可以在LINQtoSQL中实现。
还要记住,表中可能有10000多行,因此性能非常重要。纯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");
与任何非平凡查询一样,表的索引策略在这里可能很重要。您可能想尝试一个跨越用户名和排序器的索引来度量统计IO,然后删除它,然后以其他方式尝试跨越排序器和用户名的索引;再次测量统计IO。@马克:谢谢,这真是太棒了,效果非常好。让我们拭目以待,看看是否有人可以用查询语法来实现这一点。