盡量減少資料庫連線操作 —— 如同前端優化「減少 HTTP 請求」同理。
foreach (var item in mainList) // 3000 筆
{
string sql = "SELECT Col FROM OtherTable WHERE Id = " + item.Id;
string val = DbHelper.ExecuteScalar(sql); // 每次開啟/關閉連線
item.Extra = val;
}
// 1. 一次查詢取得所有必要資料
var mainList = DbHelper.Query<MainEntity>("SELECT * FROM MainTable");
var extraList = DbHelper.Query<ExtraEntity>("SELECT Id, Col FROM OtherTable WHERE Id IN (...)");
// 2. 建立查找字典
var extraDict = extraList.ToDictionary(x => x.Id, x => x.Col);
// 3. 記憶體中關聯
foreach (var item in mainList)
{
if (extraDict.TryGetValue(item.Id, out string val))
item.Extra = val;
}
或直接用 LINQ Join:
var result = from m in mainList
join e in extraList on m.Id equals e.Id
select new { m.Id, m.Name, e.Col };
SqlDataAdapter.Fill(DataSet) 一次取回多張表SqlBulkCopy 或 Table-Valued Parameters