C# Linq to Sql:选择带有自定义订单的查询

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

下表列出了it产品名称:


   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。

@马克:谢谢,这真是太棒了,效果非常好。让我们拭目以待,看看是否有人可以用查询语法来实现这一点。