Как найти ROW_NUMBER() строки с помощью Linq to SQL

Linq to SQL использует ROW_NUMBER() для подкачки, т.е. когда вы используете Skip() и Take().

Однако я не могу найти способ получить доступ к ROW_NUMBER() значениям в запросе. Мне нужно найти ROW_NUMBER() записи в запросе (без возврата всех записей).

Я сделал это успешно в T-SQL и Linq to Objects, но решение Linq to SQL оказалось неуловимым.

В Linq to Objects я могу получить номер строки следующим образом:

var rowTarget =
    mainQuery
        .Select((obj, index) => new { obj.ID, Index = index })
        .SingleOrDefault(x => x.ID == targetID);

// rowTarget.Index is the answer

Но Linq to SQL не поддерживает переопределения Select(), которые используют параметр индекса (и это действительно имеет смысл - ROW_NUMBER() будет использоваться только в том случае, если используются Skip() и Take()).

Кажется, я не могу найти решение, которое не приводит к возврату всех записей из базы данных.

Это вообще возможно?


person stucampbell    schedule 12.08.2009    source источник
comment
stackoverflow.com/questions/1165028/ дублировать?   -  person ba__friend    schedule 12.08.2009
comment
@bassfriend - EF и LINQ-to-SQL имеют совершенно разную поддержку таких операций...   -  person Marc Gravell    schedule 12.08.2009
comment
Я как бы надеялся увидеть здесь ответ. У меня та же проблема - индексированная перегрузка не работает с L2S. Я был бы счастлив с любым дополнительным идентификатором; думаю, мне придется сделать это в несколько шагов.   -  person Paul Mrozowski    schedule 18.02.2010


Ответы (2)


(изменить: пробовал, все равно выдает "Unsupported overload used for query operator 'Select'")...

Почему вы используете SelectMany здесь? Пробовали ли вы использовать версию Select, которая включает индекс?

.Select((obj, index) => new { obj.ID, Index = index })
    .SingleOrDefault(x => x.ID == targetID);

Вам также, вероятно, следует включить явное OrderBy - LINQ-to-SQL позволяет вам обойтись без него большую часть времени, но EF - нет.

person Marc Gravell    schedule 12.08.2009
comment
Спасибо, исправил запрос. Но да, как вы говорите, до сих пор не поддерживается. :( - person stucampbell; 12.08.2009

Вы должны включить AsEnumerable()

i.e .

var rowTarget = 
    mainQuery.AsEnumerable() 
        .Select((obj, index) => new { obj.ID, Index = index }) 
        .SingleOrDefault(x => x.ID == targetID); 
person user511036    schedule 17.11.2010
comment
AsEnumerable вытянет все записи из базы данных, так что это не поможет. - person jordanbtucker; 17.11.2010
comment
Голосование против этого, поскольку оно в настоящее время отображается вверху, но, как говорит DotNetWise, это не решение. - person stucampbell; 17.05.2012