Я понимаю, что если у вас есть некоторые функции в Linq запроса, который не отображает на запрос SQL, то вы должны вызвать .AsEnumerable() первая:Каков эффект использования AsEnumerable() для пейджинга?
var model = _service.GetQuery
.Where(data => data.SomeFlag == true)
.Select(data => new { Foo = CalculateFoo(data.Bar); });
не может быть выполнена Linq To SQL, но при добавлении AsEnumerable() мы можем сделать .Select() пункт выполнить с помощью LINQ к объектам, а:
var model = _service.GetQuery
.Where(data => data.SomeFlag == true)
.AsEnumerable()
.Select(data => new { Foo = CalculateFoo(data.Bar); });
Но что, если набор данных очень велик - что влияет ли AsEnumerable иметь на пейджинг? Если я говорю:.
var page = model.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);
Поскольку модель теперь IEnumerable вместо IQueryable, когда мы говорим model.Skip() Take(), это должно сначала загрузить весь набор данных из базы данных, прежде чем он может пропустить и брать? (Это поражение было цели пейджинга)
EDIT: Вопрос был написан в общем - это конкретные детали:
У меня нет контроля над пейджинга. Я создаю модель и передаю ее в грид-компонент (DevExpress в этом случае, но может быть любой сеткой). Это компонент сетки, который выдает команды пейджинга. Любое решение, которое предполагает использование .Skip(). Take() до того, как AsEnumerable() здесь невозможно.
Так что мне нужно, чтобы быть в состоянии передать эту модель к сетке, а также в то же время, чтобы убедиться, что модель использует отложенное выполнение:
var model = _service.GetQuery
.Where(data => data.SomeFlag == true)
.Select(data => new {
data.Id,
data.Customer.Code,
data.Customer.Name,
// etc, select a few other properties
Foo = CalculateFoo(data.Bar);
});
Так что теперь у меня есть камень против трудной проблемы места :
- Если я прохожу эту модель к сетке, то будет сгенерировано исключение при отображении текущей страницы, так как LINQ к SQL не может выполнить CalculateFoo()
- Если добавить AsEnumerable(), то сетка может показать текущей страницы, но для загрузки всего набора данных для этого (загрузка многих тысяч строк только для отображения 200 из них)
- Если я выйду из столбца Foo из модели, мы снова отложим выполнение, но в таблице отсутствует столбец
возможно дубликат [Понимание .AsEnumerable() в LINQ к SQL] (http://stackoverflow.com/questions/3311244/understanding-asenumerable-in-linq-to-sql) –
Я читал этот вопрос. Он не упоминает пейджинг или эффект, который AsEnumerable имеет при пейджинге. –
AsEnumerable имеет поведение. Неважно, что вы делаете с его результатом. Если вы понимаете это поведение, то вы понимаете это поведение в своем сценарии. –