2011-02-03 85 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