আইডিগুলির একটি তালিকা ব্যবহার করে ড্যাপারের সাথে প্রচুর সংখ্যক সারি সন্ধানের জন্য এখানে সম্ভবত দ্রুততম উপায়। আমি আপনাকে প্রতিশ্রুতি দিচ্ছি যে আপনি এটি ভাবতে প্রায় যে কোনও উপায়ের তুলনায় দ্রুত (কোনও উত্তরে প্রদত্ত একটি টিভিপি ব্যবহারের সম্ভাব্য ব্যতিক্রম সহ, এবং যা আমি পরীক্ষা করি নি, তবে আমি সন্দেহ করি যে আপনি এখনও জনবসতিপূর্ণ হতে পারেন বলে আমি ধীর হতে পারি) টিভিপি)। এটি সিন্প্যাক্স ব্যবহার করে ড্যাপারের চেয়ে দ্রুততর গ্রহIN
এবং সারিতে সারি সত্তা ফ্রেমওয়ার্কের চেয়ে দ্রুত ব্রহ্মাণ্ডগুলি । এবং এটি তালিকা VALUES
বা UNION ALL SELECT
আইটেমগুলিতে পাস করার চেয়েও মহাদেশগুলি দ্রুত faster এটি সহজেই একটি বহু-কলাম কী ব্যবহার করতে বাড়ানো যেতে পারে, কেবলমাত্র 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;
}
}
সাবধান থাকুন যে আপনাকে বাল্ক সন্নিবেশ সম্পর্কে কিছুটা শিখতে হবে। ফায়ারিং ট্রিগার (ডিফল্টটি হ'ল নয়), সীমাবদ্ধতাগুলির সম্মান করা, টেবিলটি লক করা, একত্রে সন্নিবেশ প্রবেশকরণের অনুমতি প্রদান ইত্যাদির বিষয়ে বিকল্প রয়েছে।