我想問一個問題。我想在foreach中使用服務。但我認為,當我呼叫服務來訪問我的資料庫的選單項時,服務可以打開新的連接。如果是這樣,我可以使用什么?在1000個專案之后可以是什么?頁面的速度會因此而降低嗎?
@foreach (var parent in Model)
{
var menuItem = _uow.Menu.GetById(parent.Id)。
@if (menuItem != null)
{
<span>@menuItem.Title</span>
}
介面服務
T GetById(span class="hljs-built_in">int id)。
Entity Framework服務
public T GetById(int id)
{
return _context.Set<T>().Find(id) 。
}
謝謝你。
uj5u.com熱心網友回復:
單獨檢索1000個專案將對資料庫進行1000次呼叫,這比單個查詢執行一次呼叫要慢(這類似于執行1000次API呼叫與一次呼叫)。
解決你的問題的方法是改變你的服務,這樣你就可以一次查詢多個ID:
var menuItems = _uow. Menu.GetByIds(Model. Select(parent => parent.Id) )。
和服務:
public IEnumerable< T> GetByIds(IEnumerable< int> ids)
{
return _context.Set<T>()。 Where(t => ids.Contains(t.id)) 。
}
uj5u.com熱心網友回復:
從你的代碼來看,每次回圈,你將訪問資料庫一次。如果在 foreach 中有 1000 個模型的計數,那么你需要訪問資料庫 1000 次。
假設資料庫訪問的回傳時間為 0.01 秒,那么 1000 次回圈在資料庫中消耗的時間為 10s。這顯然是不合理的,因為時間與foreach的數量成正比。
建議
如果某類資料需要經常被訪問,我們一般會將其存盤在快取中,例如redis快取或MemoryCache。這可以優化速度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/306978.html
標籤:
下一篇:樣式化的組件不想在螢屏上渲染
