2009-08-12 6 views
7

Linq to SQL macht von ROW_NUMBER() für Paging-Zwecke Verwendung in SQL, das heißt, wenn Sie auf Überspringen() und nehmen().Wie der ROW_NUMBER() eine Reihe mit Linq finden

Allerdings kann ich nicht scheinen, eine Art und Weise tatsächlich den Zugriff auf ROW_NUMBER() Werte selbst in der Abfrage zu finden. Ich muss die ROW_NUMBER() eines Datensatzes innerhalb einer Abfrage finden (, ohne alle Datensätze zurück zu).

Ich habe dies getan successfuly in T-SQL und Linq zu Objekten, sondern eine Linq to SQL-Lösung erweist sich schwer fassbar.

In Linq zu Objekten kann ich die Zeilennummer wie diese:

Aber Linq to SQL, die einen Index-Parameter verwenden nicht die Überschreibungen von Select() unterstützen (und das macht Sinn, wirklich - ROW_NUMBER() würde nur verwendet werden, wenn Skip() und Take() verwendet wurden).

Ich kann nicht scheinen, eine Lösung zu finden, die nicht dazu führt, dass alle Datensätze von der Datenbank zurückgegeben werden.

Ist das überhaupt möglich?

+0

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

+1

@bassfriend - EF und LINQ-to-SQL haben eine völlig andere Unterstützung für solche Operationen ... –

+0

Ich hoffte, hier eine Antwort zu sehen. Ich laufe auf das gleiche Problem - die indizierte Überladung funktioniert nicht mit L2S. Ich wäre glücklich mit einer inkrementellen ID; Ich denke, ich muss es in mehreren Schritten machen. –

Antwort

2

(edit: es versucht, noch gibt "Unsupported overload used for query operator 'Select'") ...

Warum Sie SelectMany hier verwenden? Haben Sie es mit der Version Select versucht, die den Index enthält?

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

Sie auch wahrscheinlich sollte auch eine explizite OrderBy - LINQ-to-SQL, ohne sie die meiste Zeit weg lässt, aber EF nicht.

+0

Danke Ich habe die Abfrage behoben. Aber ja, wie du sagst, immer noch nicht unterstützt. :( – stucampbell

+0

keine Lösung für dieses Problem noch? (* Neben einer SQL-Funktion? *) –

-1

Sie müssen AsEnumerable einschließen()

d.

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

'AsEnumerable' wird alle Datensätze aus der Datenbank nach unten ziehen, so dass er den Zweck besiegt. – jordanbtucker

+0

Das ist nicht wirklich eine Lösung, jemand bitte geben Sie Ihre Meinung unten – Adaptabi

+0

Dies wird abgemindert, da es derzeit an der Spitze erscheint, aber wie DotNetWise sagt, es ist keine Lösung. – stucampbell

Verwandte Themen