亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實體框架 -> 從數據庫中一一獲取記錄或一次獲取它們。哪個更快?

實體框架 -> 從數據庫中一一獲取記錄或一次獲取它們。哪個更快?

C#
猛跑小豬 2023-09-09 16:17:43
我收集了來自數據庫中兩個表的 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因為一個值總是等于它自己。我假設您添加的代碼在實踐中并未使用,而是更多地用于展示此問題的意圖。


查看完整回答
反對 回復 2023-09-09
  • 1 回答
  • 0 關注
  • 121 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號