2011-02-03 51 views
1

与客户订单选择查询我们下面的表格,将其命名产品:LINQ到SQL:通过


    UserName ProductName SortOrder 
    -------------------------------------- 
    U1   U1P1   2 
    U1   U1P2   3 
    U1   U1P3   5 
    U2   U2P1   1 
    U2   U2P2   2 
    U3   U3P1   4   

用户名和产品名称可以是任何东西。每个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行,因此性能很重要。

回答

2

Pure linq(即查询语法)?从来没听说过。

Linq-to-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的索引(测量stats-IO),然后删除它并尝试一个跨越SortOrderUserName的索引(以其他方式;再次测量stats-IO)。

+0

@马克:谢谢,这真的很棒,完美的作品。让我们拭目以待,看看有人能用查询语法来做到这一点。 – Atashbahar 2011-02-03 07:09:59