У меня есть веб-страница, на которой данные, возвращаемые из базы данных, разбиваются на страницы, обычно с использованием какого-либо фильтра. Я возвращаю данные на выбранной странице плюс общее количество результатов, чтобы можно было настроить нумерацию страниц. Я достигаю этого сейчас, выполнив два запроса. Один для получения общего количества результатов, а другой для получения данных для запрошенной страницы. Интересно, было бы эффективнее и быстрее сделать это в одном запросе? Я могу добиться этого, выполнив запрос такого типа в MySQL:
Код: Выделить всё
SELECT
u.*,
COUNT(*) OVER () AS total_count
FROM
Users u
WHERE
u.Name Like '%John%'
ORDER BY
u.Name
LIMIT 0,30
Я попытался перевести этот запрос в LINQ с помощью EF Core следующим образом:
Код: Выделить всё
var filterQuery = dbContext.Users.Where(u => u.Contains("John");
var data = filterQuery
.Select(x => new {
Count = queryable.Count(),
Data = x
})
.Skip(0)
.Take(30)
.ToList();
Но ядро EF по-прежнему выполняет 2 запроса:
Код: Выделить всё
SELECT COUNT(*) FROM Users WHERE Name Like '%John%'
сохраняет это в переменной, которая затем используется в последующем запросе в качестве поля.
Код: Выделить всё
SELECT
@__Count_1 AS `Count`,
u.*
FROM
Users AS u
WHERE
u.Name Like '%John%'
ORDER BY
u.Name
LIMIT 10 OFFSET 0
Я попробовал несколько переводчиков SQL в LINQ, но они, похоже, не помогли.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... ng-ef-core