Was ist der beste Weg, um eine Abfrage mit IN-Klausel mit Dapper ORM zu schreiben, wenn die Liste der Werte für die IN-Klausel aus der Geschäftslogik stammt? Angenommen, ich habe eine Abfrage:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Das commaSeparatedListOfIDs
wird von der Geschäftslogik übergeben und kann jede Art von sein IEnumerable(of Integer)
. Wie würde ich in diesem Fall eine Abfrage erstellen? Muss ich das tun, was ich bisher getan habe, was im Grunde eine Verkettung von Zeichenfolgen ist, oder gibt es eine Art fortgeschrittene Parameterzuordnungstechnik, die mir nicht bekannt ist?
IN
Klausel.Direkt von der GitHub-Projekthomepage :
Wird übersetzt in:
quelle
Wenn Ihre
IN
Klausel für MSSQL zu groß ist, können Sie ganz einfach einen TableValueParameter mit Dapper verwenden.Erstellen Sie Ihren TVP-Typ in MSSQL:
Erstellen Sie eine
DataTable
mit denselben Spalten wie dem TVP und füllen Sie sie mit WertenÄndern Sie Ihre Dapper-Abfrage, um eine
INNER JOIN
in der TVP-Tabelle auszuführen:Übergeben Sie die DataTable in Ihrem Dapper-Abfrageaufruf
Dies funktioniert auch fantastisch, wenn Sie eine Massenaktualisierung mehrerer Spalten durchführen möchten - erstellen Sie einfach einen TVP und führen Sie
UPDATE
einen inneren Join mit dem TVP durch.quelle
ProviderId
MyTVP
PRIMARY KEY CLUSTERED
Hier ist möglicherweise der schnellste Weg, um eine große Anzahl von Zeilen mit Dapper mithilfe einer Liste von IDs abzufragen. Ich verspreche Ihnen, dass dies schneller ist als fast jede andere Art, die Sie sich vorstellen können (mit der möglichen Ausnahme, dass Sie einen TVP verwenden, wie in einer anderen Antwort angegeben, und den ich nicht getestet habe, aber ich vermute, dass er langsamer ist, weil Sie noch füllen müssen der TVP). Es ist Planeten schneller als Dapper mit
IN
Syntax und Universen schneller als Entity Framework Zeile für Zeile. Und es ist sogar Kontinente schneller als das Übergeben einer Liste vonVALUES
oderUNION ALL SELECT
Gegenständen. Es kann leicht erweitert werden, um einen mehrspaltigen Schlüssel zu verwenden. Fügen Sie einfach die zusätzlichen Spalten zu denDataTable
Bedingungen, der temporären Tabelle und den Verknüpfungsbedingungen hinzu.Beachten Sie, dass Sie ein wenig über Bulk Inserts lernen müssen. Es gibt Optionen zum Auslösen von Triggern (die Standardeinstellung ist Nein), zum Beachten von Einschränkungen, zum Sperren der Tabelle, zum Zulassen gleichzeitiger Einfügungen usw.
quelle
DataTable
wird für den Bulk-Einsatz benötigt. Wie füge ich 50.000 Werte in die temporäre Tabelle ein?Stellen Sie außerdem sicher, dass Sie Ihre Abfragezeichenfolge nicht wie folgt in Klammern setzen:
Ich hatte diese Ursache einen SQL-Syntaxfehler mit Dapper 1.50.2, der durch Entfernen von Klammern behoben wurde
quelle
Es ist nicht erforderlich ,
()
die WHERE-Klausel wie in einem normalen SQL hinzuzufügen . Weil Dapper das automatisch für uns erledigt. Hier ist dassyntax
: -quelle
Beispiel für Postgres:
quelle
In meinem Fall habe ich Folgendes verwendet:
Meine Variable "ids" in der zweiten Zeile ist eine IE-Zahl von Zeichenfolgen. Sie können auch Ganzzahlen sein, denke ich.
quelle
List<string>
?Nach meiner Erfahrung besteht die freundlichste Art, damit umzugehen, darin, eine Funktion zu haben, die eine Zeichenfolge in eine Wertetabelle konvertiert.
Es gibt viele Splitter-Funktionen im Web, Sie werden leicht eine für was auch immer finden, wenn Sie SQL-Geschmack haben.
Sie können dann tun ...
Oder
(O.ä)
quelle