我正在努力使用 Entity Framework Core 提高后端性能。這是一個小而簡單的示例,用于說明我想要回傳的內容:
var filteredMovies = _dataService
.Repository
.Where(movie => movie.Genre == 'Drama')
.Where(...many other conditions, joins, etc...);
var counts1 = filteredMovies.Count(movie => movie.director == 'Spielberg');
var counts2 = filteredMovies.Count(movie => movie.director == 'Nolan');
return new Summary
{
SpielbergCount = counts1,
NolanCount = counts2,
};
這將生成 2 個 SQL 查詢,每個查詢都經過所有 WHERE、JOIN 步驟。我在 SQL 中看到的是,我可以通過這種方式撰寫它以僅執行 1 個查詢:
SELECT
SUM(CASE WHEN Director = 'Spielberg' THEN 1 ELSE 0 END) SpielbergCount,
SUM(CASE WHEN Director = 'Nolan' THEN 1 ELSE 0 END) NolanCount
FROM Movies
JOIN ....
WHERE ....
2個問題:
- 如何將最后一個查詢轉換為 EntityFramework,以防止執行 2 個不同的 SQL 查詢?
- 它會提高性能嗎?(即:這是一個小例子,但我有很多查詢需要改進,其中一些非常大,大多數查詢都相同,除了一個條件,如本例中的 Director)或者實際上并沒有改進任何事物?
謝謝
uj5u.com熱心網友回復:
return _dataService
.Repository
.Where(movie => movie.Genre == 'Drama')
.Where(movie => movie.director == 'Spielberg' || movie.director == 'Nolan')
.Where(...many other conditions, joins, etc...)
.GroupBy(movie => movie.director)
.Select(g => new Summary
{
SpielbergCount = g.Count(x => x.director == 'Spielberg'),
NolanCount = g.Count(x => x.director == 'Nolan'),
});
1. 如何將最后一個查詢轉換為 EntityFramework,以防止執行 2 個不同的 SQL 查詢?
嘗試使用 Group By 和 Count with Filter。
2.它會提高性能嗎?或者它實際上并沒有改善任何東西?
提高性能的幾個技巧
- 如果不需要,避免獲取所有欄位
- 僅檢索所需數量的記錄
- 如果您想將處理從 SQL 服務器移動到您的應用程式服務器,請嘗試使用 AsEnumerable。
uj5u.com熱心網友回復:
為了在一個選擇中進行多個頂級聚合,您必須對一個常量值進行分組。
var counts = _dataService
.Repository
.Where(movie => movie.Genre == 'Drama')
.Where(...many other conditions, joins, etc...)
.GroupBy(x => 1)
.Select(grp => new Summary
{
SpielbergCount = grp.Count(movie => movie.director == 'Spielberg'),
NolanCount = grp.Count(movie => movie.director == 'Nolan'),
})
.Single();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351990.html
下一篇:如何生成和繪制所有生成樹?
