Почему мой оператор LINQ возвращает IEnumerable? - PullRequest
5 голосов
/ 21 августа 2009

У меня есть два очень похожих метода:

public IQueryable<User> Find(Func<User, bool> exp)
{
    return db.Users.Where(exp);
}

public IQueryable<User> All()
{
    return db.Users.Where(x => !x.deleted);
}

Верхний не компилируется, говоря, что он возвращает IEnumerable, а не IQueryable.

Почему это?

Кроме того, я знаю, что могу добавить "AsQueryable ()" в конце, и он будет работать. Какая разница, хотя? Хиты производительности? Я понимаю, что IQueryable имеет отложенное выполнение, и я все равно получу это преимущество?

1 Ответ

17 голосов
/ 21 августа 2009

Enumerable.Where занимает Func<T, bool>.

Queryable.Where занимает Expression<Func<T, bool>>.

Вы звоните Куда с Func<T, bool>, поэтому применим только вызов Enumerable.Where, который возвращает IEnumerable<T>.

Измените свой метод на:

public IQueryable<User> Find(Expression<Func<User, bool>> exp)
{
    return db.Users.Where(exp);
}

и все должно быть в порядке. По сути, вы хотите передать дерево выражений вместо делегата, чтобы выражение можно было преобразовать в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...