Из того, что я видел, это невозможно в LINQ to SQL без небольшого взлома.
Я обнаружил, что этот метод работает.Краткая сводка этого метода: я преобразую объект IQueryable
в объект команды и изменяю текст команды, чтобы включить общее количество в набор результатов.Исходный SQL-запрос конвертера LINQ to SQL использует синтаксис ROW_NUMBER() OVER()
для разбиения на строки, я просто добавляю COUNT(*) OVER()
, чтобы получить общее количество.
Добавьте этот метод в свой класс DataContext.
public IEnumerable<TWithTotal> ExecutePagedQuery<T, TWithTotal>(IQueryable<T> query, int pageSize, int pageNumber, out int count)
where TWithTotal : IWithTotal
{
var cmd = this.GetCommand(query.Skip(pageSize * pageNumber).Take(pageSize));
var commandText = cmd.CommandText.Replace("SELECT ROW_NUMBER() OVER", "SELECT COUNT(*) OVER() AS TOTALROWS, ROW_NUMBER() OVER");
commandText = "SELECT TOTALROWS AS TotalCount," + commandText.Remove(0, 6);
cmd.CommandText = commandText;
var reader = cmd.ExecuteReader();
var list = this.Translate<TWithTotal>(reader).ToList();
if (list.Count > 0)
count = list[0].TotalCount;
else
count = 0;
return list;
}
Вам нужно будет создать новый класс, который содержит все свойства исходного объекта, реализующего интерфейс IWithTotal
.
ОБНОВЛЕНИЕ: Вы не можете смешивать сопоставленные инесопоставленные столбцы в LINQ to SQL.
public interface IWithTotal
{
int TotalCount { get; set; }
}
public class Project : IWithTotal
{
public int TotalCount { get; set; }
public int ProjectID { get; set; }
public string Name { get; set; }
}
DataContext.Translate
предъявляет некоторые требования, поэтому убедитесь, что ваш запрос удовлетворяет этим требованиям, если у вас есть какие-либо проблемы.На сложности запроса, вы должны увидеть увеличение производительности.Ниже приведены показатели тестирования, которое я провел с запросом подсчета, постраничным запросом выбора и постраничным выбором с запросом подсчета.Проценты - это стоимость запроса относительно пакета.
Count - 6%
Select with paging - 47%
Select with paging + Count - 48%