LINQ: возвращение 2 SELECTs в 1 IQueryable для нумерации страниц? Сохранение в соответствии с шаблоном репозитория и отсутствие изменения типа возвращаемого значения. - PullRequest
2 голосов
/ 26 ноября 2010

Можно ли вернуть 2 выбора с 1 Iqueryable?

У меня есть метод, который в основном возвращает некоторые записи, но я использую его для подкачки, поэтому мне также нужно вернуть количество ВСЕГО записей. Это работает, но вместо того, чтобы создавать конкретный класс с 2 свойствами (1 для счетчика и 1 для моего выбора), я бы предпочел придерживаться IQueryable, но я не уверен, будет ли он работать.

Вот пример того, что возвращается из моего СЧЕТА:

 56

Это относится к количеству записей в таблице.

И тогда мой выбор возвращает страницу с количеством записей на страницу, т.е.

ID      Name
32      John
33      Peter
34      David

так что, как вы можете видеть, у меня фактически 2 выбора - 1, который возвращает количество записей в таблице, и 1, который возвращает подмножество записей из таблицы. Конечно, я выполняю эти 2 значения как 2 отдельных запроса в моем методе (C #), поэтому у меня есть 2 действующих iqueryable переменных, и мне нужно вернуть оба из метода.

Итак, я хотел, чтобы мой метод return соответствовал стандарту для шаблона репозитория, т.е. возвращал IQueryable - но как мне это сделать?

Я не хотел создавать 2 метода, 1 для возврата счетчика и другой для возврата подмножества, и, как я уже сказал, я не хотел менять тип возвращаемого значения на конкретный класс (например), который имеет 2 свойства, называемые Count и Data.

1 Ответ

5 голосов
/ 26 ноября 2010

Нет, в основном. LINQ-to-SQL сам поддерживает несколько сеток, но обычно при вызове хранимой процедуры, и не через IQueryable<T>. А поскольку вы не хотите менять схему, вы не можете использовать нахальный ExecuteQuery<T> с фиктивным столбцом. Так что нет.

Вы могли бы , однако сделать что-то вроде следующего (что, конечно, потребует 2 поездки в оба конца на сервер):

public static IQueryable<T> GetPage(this IQueryable<T> query,
    int skip, int take, out int count)
{
    count = query.Count();
    return query.Skip(skip).Take(take);
}
...