संभवतः आईडी की सूची का उपयोग करके डैपर के साथ बड़ी संख्या में पंक्तियों को क्वेरी करने का सबसे तेज़ तरीका है। मैं आपसे वादा करता हूं कि यह लगभग किसी भी अन्य तरीके से तेज है, जिसके बारे में आप सोच सकते हैं (एक टीवीपी का उपयोग करने के संभावित अपवाद के रूप में, जो दूसरे उत्तर में दिया गया है, और जिसे मैंने परीक्षण नहीं किया है, लेकिन मुझे संदेह है कि आप धीमी हो सकते हैं क्योंकि आपको अभी भी आबाद करना है TVP)। यह डायपर की तुलना में तेजी से ग्रह हैIN
और पंक्ति द्वारा इकाई फ्रेमवर्क पंक्ति की तुलना में तेजी से सिंटैक्स और ब्रह्मांडों का उपयोग कर रहा है । और यह वस्तुओं VALUES
या UNION ALL SELECT
वस्तुओं की सूची में पास होने से भी तेज है । इसे आसानी से एक बहु-स्तंभ कुंजी का उपयोग करने के लिए बढ़ाया जा सकता है, बस अतिरिक्त स्तंभों को DataTable
, अस्थायी तालिका और सम्मिलित स्थितियों में जोड़ सकते हैं।
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;
}
}
ध्यान रखें कि आपको बल्क इंसर्ट के बारे में थोड़ा जानने की जरूरत है। फायरिंग ट्रिगर (डिफ़ॉल्ट नहीं है) के बारे में विकल्प हैं, बाधाओं का सम्मान करते हुए, टेबल को लॉक करना, समवर्ती आवेषण की अनुमति देना, और इसी तरह।