Linq to Sql: выберите запрос в произвольном порядке - PullRequest
1 голос
/ 03 февраля 2011

У нас есть следующая таблица, назовите ее Продукты:


   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 строк, поэтому производительность важна.

1 Ответ

2 голосов
/ 03 февраля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...