我收集了來自數據庫中兩個表的 Id。這兩個對象都有一個我需要的共同屬性。我將始終只選擇此屬性,但我的問題是:將 Id 的集合分成兩部分并從數據庫進行兩個查詢或使用循環并從數據庫中一個接一個地獲取每個對象是否更好?第一種方法List<byte[]> binariesToAttach = new List<byte[]>();IEnumerable<someObj> Type1objects = toAppend.Where(a => a.Type == FileType.Type1Obj).Select(f => f.Id);IEnumerable<someObj> Type2objects = toAppend.Where(a => a.Type == FileType.Type2Obj).Select(f => f.Id);binariesToAttach.AddRange(this.UnitOfWork.Example1Repository.Get(s => Type1objects.Any(a => s.Id == a)).Select(f => f.Content));binariesToAttach.AddRange(this.UnitOfWork.Example2Repository.Get(s => Type2objects.Any(a => s.Id == a)).Select(f => f.Content));foreach (var item in binariesToAttach){ // TODO something}或第二種方法:foreach (var item in toAppend){ if (item.Type == FileType.Type1Obj) { byte[] data = this.UnitOfWork.Example1Repository.Get(a => a.Id == item.Id).Select(a => a.Content).FirstOrDefault(); // TODO something } else { byte[] data = this.UnitOfWork.Example2Repository.Get(a => a.Id == item.Id).Select(a => a.Content).FirstOrDefault(); // TODO something }}就我個人而言,我認為第二種方法更容易理解,這就是我更喜歡他的原因。但如果第一個更優化的話..
1 回答

SMILET
TA貢獻1796條經驗 獲得超4個贊
簡短而簡單的答案是,對于每次調用數據庫,都需要執行多項操作,例如打開連接、身份驗證、授權、關閉連接(可能我忘記了更多,但我不是 DBA,所以我'我對所采取的具體行動有點模糊)。
針對每個請求都會采取這些操作。您發出的請求越多,需要完成的工作就越多。如果請求量足夠大,這種時間/精力就會嚴重消耗性能。
因此,通常最好一次獲取所有數據。這里可能存在一些情況例外,但您應該在盡可能少的請求中加載盡可能多的內容。
作為未來的一般提示:您可以通過編寫一個小型控制臺應用程序來輕松地自行進行基準測試,該應用程序可以一次或逐條獲取 1000 行數據,并比較完成任一任務所需的時間。
順便說一句,您的第一種方法存在問題。Any(a => a.Id == a.Id)
總是true
因為一個值總是等于它自己。我假設您添加的代碼在實踐中并未使用,而是更多地用于展示此問題的意圖。
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消