2011-02-03 1 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 и ProductName может быть что угодно. SortOrder для каждого UserName является инкрементным, но может начинаться с любого индекса, и между ними может быть разрыв.
мне нужен запрос, который сортирует данные таким образом:


    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

Чистый 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"); 

Как и с любым нетривиальным запросом, стратегия индекса стола может быть важна. Вы можете попробовать использовать индекс UserName и SortOrder (измерьте статистику-IO), затем удалите это и попробуйте индекс, охватывающий SortOrder и UserName (наоборот, снова измерьте статистику-IO).

+0

@Mark: Спасибо, это действительно здорово и отлично работает. Подождем и посмотрим, сможет ли кто-нибудь это сделать с синтаксисом запроса. – Atashbahar

Смежные вопросы