Как да намерите ROW_NUMBER() на ред с Linq to SQL

Linq към SQL използва ROW_NUMBER() за целите на пейджинг, т.е. когато използвате Skip() и Take().

Изглежда обаче не мога да намеря начин за реален достъп до ROW_NUMBER() стойности сам в заявката. Трябва да намеря ROW_NUMBER() на запис в рамките на заявка (без да връщам всички записи обратно).

Направих това успешно в T-SQL и Linq to Objects, но решението Linq to SQL се оказва неуловимо.

В Link to Objects мога да получа номера на реда по този начин:

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

// rowTarget.Index is the answer

Но Linq към 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