-1
我有頁與分頁和電影搜索,電影表有388262記錄。沒有使用搜索,下面的代碼工作得很快。但是當使用搜索(vm.Search被填充)時,檢索記錄變得緩慢。如何結合LINQ包含查詢與所有記錄計數和檢索與偏移的記錄
所以基本上它做了兩次contains/like查詢,一次是用偏移量返回結果,一次是沒有偏移量的計數,這是正確的,但是有沒有辦法將這個結合起來以提高性能?
奇怪的是,當我使用日誌中的查詢並使用SSMS(SQL Server Management Studio)直接在數據庫上執行它們時。它在大約2秒內相當快地執行兩個查詢。使用code/linq執行大約需要10秒鐘嗎?
,我做的LINQ代碼:
public IActionResult Index(MovieIndexViewModel vm) {
IQueryable<Movie> query = _movieRepository.GetQueryable().AsNoTracking()
.Select(m => new Movie {
movie_id = m.movie_id,
title = m.title,
description = m.description
});
if (!string.IsNullOrWhiteSpace(vm.Search)) {
query = query.Where(m => m.title.Contains(vm.Search));
}
vm.Movies = query.Skip(_pageSize * (vm.Page - 1)).Take(_pageSize).ToList();
vm.PageSize = _pageSize;
vm.TotalItemCount = query.Count();
return View(vm);
}
SQL日誌從行與跳躍和Take:
SELECT COUNT(*)
FROM [Movie] AS [m]
WHERE [m].[title] LIKE ('%' + @__vm_Search_0) + '%'
:從伯爵的線
SELECT [m].[movie_id], [m].[title], [m].[description]
FROM [Movie] AS [m]
WHERE [m].[title] LIKE ('%' + @__vm_Search_0) + '%'
ORDER BY @@ROWCOUNT
OFFSET 0 ROWS FETCH NEXT 30 ROWS ONLY
SQL日誌
聽起來像你的問題與你問的沒有任何關係。 EF中存在性能問題。你應該解決這個問題。嘗試清除查詢緩存。 – Aron
我不知道爲什麼你必須調用_movieRepository.GetQueryable()。除非您的_movieRepository不是'IQueryable',否則這會檢測redudant。你能發佈它的定義嗎?如果它是'IEnumerable ',那麼這就是你的問題:它發生在整個數據集的內存中 –
Tseng
@Tseng _movieRepository是來自存儲庫模式的存儲庫。 GetQueryable是我自己做的一個函數,它爲Movie實體返回一個IQueryable。當我更多地使用這個函數時,它會在movieRepository中獲得它自己的函數。而不是將這些邏輯直接放在我的控制器中。 –