Wie übersetze ich eine Abfrage mit ROW_NUMBER() in linq?
Meine Tabelle besteht aus drei Spalten (sno,name,Alter). Ich bin das abrufen dieser Tabelle aus der Datenbank mit zusätzlichen Spalte (Zeile, Anzahl), und ich verwendete den folgenden code:
select * from (
select ROW_NUMBER() over (order by SNo asc)as rowindex,SNo,Name,Age
from tblExample)
as example where rowindex between ((pageindex*10)+1) and ((pageindex+1)*10)
Hinweis, pageindex ist die variable, die dauert einige integer-Wert, der übergeben wird, durch den Benutzer.
Meine Datenbank ist Sql Server 2008. Ich möchte schreiben die gleiche Abfrage mit Linq. Wie mache ich das?
- LINQ to SQL? LINQ-to-EF?
- Ohne ziehen der gesamten Reihe und evtl. mit einer variable oder die überladene
.Select
Betreiber, glaube ich nicht, es ist eine LINQ Befehl, zu übersetzen, um diese Abfrage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Sie Abfrage wie beow
An expression tree may not contain an assignment operator
Wie genau funktioniert diese Arbeit für Sie (ohne Sie lokal Zwischenspeichern der Liste ersten)?Nicht direkte übersetzung, aber da die Zeilen-Nummer erscheint nur, um für die Auslagerung verwendet werden, versuchen Sie Folgendes:
BEARBEITEN
Wenn
Select((t,i) => ...)
nicht funktioniert, können Sie versuchen, die Synthese der index-Nummer, indem Sie es nach feuchtigkeitsspendende die Abfrage:Sollten Sie am Ende mit entspricht SQL-außer der Tatsache, dass die
rowindex
Feld nicht zurückgegeben werden aus der SQL-Abfrage, sondern werden Hinzugefügt, indem Sie die Elementauswahl Ausdruck..Select(Func<TSource, Int32, TResult>)
überlastung eine Abfrage zu erstellen (Unsupported overload used for query operator 'Select'.
), die Ergebnisse werden lokal gespeichert ersten. Also, wenn das ein DB-Kontext, Sie würde anrufen.ToList()
(oder equiv) zuerst..ToList()
vor der.Select()
wie es hier geschrieben; das würde alles laden zu Erinnerung, die Niederlagen der Zweck des paging. Stattdessen machen die.Skip()
und.Take()
zuerst, dann.ToList()
, dann.Select()
des Ergebnisses in Ausgabeformat.Unsupported overload...
..ToList()
oder ähnliches, Sie tun sollten, wenn nachdem haben Sie schneiden Sie es nach unten, um eine Seite Wert. Ich habe gesehen, viele Fragen Fragen, warum paging mit.Skip()
und.Take()
war nicht so dass es schneller wird, wo die Antwort war, dass der Fragesteller Berufung war.ToList()
bevor paging, so dass es ein wenig redundant.Best-case-Szenario (wenn Sie müssen die Metadaten):
Der einzige Nachteil hier ist, dass die gesamte Datenbestand muss gezogen werden um diese Metadaten. Jedoch, wenn Sie
.Skip
&.Take
und LINQ automatisch übersetzen, die in einer rownumber (Sie einfach nicht in der Lage sein zu verwenden, die Metadaten später). z.B.die sollte Sie so etwas wie:
So, jetzt die
row_number
wird intern in SQL, aber du bist nicht in der Lage, den Zugriff, um es in Ihrem code.Wenn Sie wirklich wollen, diese Art von Zugriff, Sie können es besser manuell senden der Abfrage an den server. Eine lib, die funktioniert gut mit dieser Art der Sache ist dapper-dot-net, das würde so Aussehen:
.Select()
die wie folgt aussieht:.Select((x, i) => new {Index = i, Item = x})
die Ergebnisse in einem Objekt, woobj.Index
ist die Nummer der Zeile..Skip()
und.Take()
, die Chancen sind Sie sind mit Ihnen für die Auslagerung und der ganze Sinn der Auslagerung ist, dass du dein ResultSet in handhabbare Teile. Wenn Ihre Seiten sind groß genug, dass das laden der collection zum Speicher ist ein problem, dann tun paging falsch.