3 Stimmen

Verwendung von .Contains() mit linq-to-sql

Ich habe die folgende Abfrage, die eine Liste von ints als Parameter empfängt:

public int GetMostRecent(List<int> TheIDs)
{
 ...using MyDC...

   var TheMostRecentID = (from d in MyDC.Data
                           where TheIDs.Contains(d.ID)
                           orderby d.DateTime
                           select d.ID).LastOrDefault(); 
}

Ist dies der beste Weg, um eine Liste innerhalb einer Parameterauflistung mit Daten in der Datenbank abzugleichen, oder gibt es einen besseren Weg als die Verwendung der Methode .Contains() in linq-to-sql.

Gracias.

9voto

Adam Robinson Punkte 176996

Was Sie haben, ist richtig. Dies wird übersetzt in eine IN Klausel in SQL mit den in der Sammlung angegebenen Werten.

In diesem Zusammenhang sollten Sie versuchen, die Abfrage nach Datum zu ordnen absteigend und verwenden FirstOrDefault() . So wie es jetzt ist, werden Sie die gesamte Ergebnismenge zurückbringen und jede Zeile bis auf eine wegwerfen.

4voto

Marcel Perju Punkte 202

Bei solchen Abfragen sollten Sie vorsichtig sein mit list.Contains() innerhalb von linq query . Denn für jedes Listenelement wird eine param en sql statement .

Und es gibt eine begrenzte Anzahl von Parametern, die in einer Sql-Anweisung erlaubt sind, <= 2100 . Wenn also Ihr DieIDs enthält mehr als 2100 Elemente wird es scheitern .

Wenn Sie auf diese Weise vorgehen wollen, sollten Sie zumindest Ihre DieIDs count und wenn mehr als 2100 tauchte es in Stücke mit weniger als 2100 Elemente.

1voto

Roy Dictus Punkte 31481

Dies wird in effizientes SQL übersetzt, so dass es nicht notwendig ist, etwas anderes zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X