Оказывается вернуть IEnumerable, а не IQueryable:Возможно ли вернуть IQueryable <> обратно из набора EF при применении предиката?
метод параметра: Func<Cat, bool> predicate
код:
var allCats = _catEntities.GetCats(); // IQueryable
if (skip.HasValue) allCats = allCats .Skip(skip.Value);
if (take.HasValue) allCats = allCats .Take(take.Value);
if (predicate != null)
{
allCats = allCats.Where(predicate);
}
Это не компилируется, потому что .Where
возвращается IEnumerable
вместо IQueryable
. Я знаю, что могу делать .AsQueryable
или что-то еще, но я подозреваю, что это не будет относиться к нему как к правильному IQueryable
.
Есть ли это простое исправление?
интересная, спасибо. Как он прекомпилирует его, учитывая, что он передан как параметр? Это может быть одна из многих вещей. Исправлено, спасибо. – NibblyPig
Есть два (больших) шага. Компилятор C# преобразует лямбда-выражение в дерево выражений (т. Е. [Абстрактное дерево синтаксиса] (http://en.wikipedia.org/wiki/Abstract_syntax_tree)). Затем поставщик LINQ обрабатывает дерево выражений и преобразует его в форму, которую он может выполнить (в случае EF, код SQL). –