Linq to Sql:用自定义顺序选择查询

时间:2011-02-03 05:48:09

标签: c# linq-to-sql

我们有下表,将其命名为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行以上,因此性能非常重要。

1 个答案:

答案 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");

与任何非平凡的查询一样,表的索引策略在这里可能很重要。您可能希望尝试跨越UserNameSortOrder的索引(衡量统计数据IO),然后将其删除并尝试跨越SortOrderUserName的索引(反之亦然) ;再次,衡量统计数据-IO)。