2009-08-12 10 views
7

Linq do SQL używa ROW_NUMBER() do celów przywoławczych, tj. Gdy używasz Pomiń() i Take().Jak znaleźć ROW_NUMBER() wiersza z Linq do SQL

Jednak nie mogę znaleźć sposobu na rzeczywisty dostęp do wartości ROW_NUMBER() w zapytaniu. Muszę znaleźć ROW_NUMBER() rekordu w zapytaniu (bez przywracania wszystkich rekordów).

Zrobiłem to z powodzeniem w T-SQL i Linq to Objects, ale rozwiązanie Linq to SQL okazuje się nieuchwytne.

w LINQ to Objects mogę uzyskać numer wiersza takiego:

Ale LINQ to SQL nie obsługuje przesłonięcia z Select() które używają parametru indeksu (i to ma sens, naprawdę - ROW_NUMBER() byłoby należy używać tylko wtedy, gdy używane są Skip() i Take().

Nie mogę znaleźć rozwiązania, które nie spowoduje, że wszystkie rekordy zostaną zwrócone z bazy danych.

Czy to możliwe?

+0

http://stackoverflow.com/questions/1165028/how-do-i-add-rownumber-to-a-linq-query-or-entity duplikat? –

+1

@bassfriend - EF i LINQ-SQL mają zupełnie inne wsparcie dla takich operacji ... –

+0

Miałem nadzieję, że zobaczę odpowiedź tutaj. Występuje ten sam problem - indeksowane przeciążenie nie działa w/L2S. Byłbym szczęśliwy z każdym przyrostowym ID; zgaduję, że będę musiał to zrobić w wielu krokach. –

Odpowiedz

2

(edit: próbowałem go, a jednak daje "Unsupported overload used for query operator 'Select'") ...

Dlaczego używasz SelectMany tutaj? Czy próbowałeś go z wersją Select, która zawiera indeks?

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

Należy również prawdopodobnie zawierać wyraźne OrderBy - LINQ-SQL pozwala uciec bez niego większość czasu, ale EF nie.

+0

Dzięki poprawiono zapytanie. Ale tak, jak mówisz, wciąż nie jest obsługiwane. :( – stucampbell

+0

nie ma rozwiązania tego jeszcze? (* Oprócz funkcji SQL? *) –

-1

Należy dołączyć AsEnumerable()

tj.

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

'AsEnumerable' ściągnie wszystkie rekordy z bazy danych, więc to pokonuje cel – jordanbtucker

+0

To nie jest tak naprawdę rozwiązanie, proszę kogoś zagłosuj – Adaptabi

+0

Zmniejszono to, ponieważ obecnie pojawia się na górze, ale jak mówi DotNetWise, nie jest to rozwiązanie. – stucampbell