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 von VALUES
oder UNION 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 den DataTable
Bedingungen, der temporären Tabelle und den Verknüpfungsbedingungen hinzu.
public IReadOnlyCollection<Item> GetItemsByItemIds(IEnumerable<int> items) {
var itemList = new HashSet(items);
if (itemList.Count == 0) { return Enumerable.Empty<Item>().ToList().AsReadOnly(); }
var itemDataTable = new DataTable();
itemDataTable.Columns.Add("ItemId", typeof(int));
itemList.ForEach(itemid => itemDataTable.Rows.Add(itemid));
using (SqlConnection conn = GetConnection()) // however you get a connection
using (var transaction = conn.BeginTransaction()) {
conn.Execute(
"CREATE TABLE #Items (ItemId int NOT NULL PRIMARY KEY CLUSTERED);",
transaction: transaction
);
new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction) {
DestinationTableName = "#Items",
BulkCopyTimeout = 3600 // ridiculously large
}
.WriteToServer(itemDataTable);
var result = conn
.Query<Item>(@"
SELECT i.ItemId, i.ItemName
FROM #Items x INNER JOIN dbo.Items i ON x.ItemId = i.ItemId
DROP TABLE #Items;",
transaction: transaction,
commandTimeout: 3600
)
.ToList()
.AsReadOnly();
transaction.Rollback(); // Or commit if you like
return result;
}
}
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.