Как получить методы расширения IQueryable <T>вместо расширений IEnumerable <T>? - PullRequest
2 голосов
/ 30 августа 2011

Наверное, действительно просто, поэтому, пожалуйста, извините за мое невежество ...

Насколько мне известно, существует несколько разновидностей метода расширения Where():

Queryable.Where<TSource> Method (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)

Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)

Оба вышеперечисленных расширения размещены в пространстве имен System.Linq, так что я могу вообще сделать Where(), можно надеяться, достаточно доказательств того, что я импортировал правильное пространство имен или есть другое пространство имен, которое мне нужно для расширений IQueryable?

Я понимаю, что IQueryable<T> наследуется от IEnumerable<T>, но почему я не могу получить расширения IQueryable<T>?

class Test
{
    IQueryable<Test> SomeMethod(Func<T, bool> criteria)
    {
        return new List<Test> { new Test() }.AsQueryable().Where(criteria); // compiler error converting IEnumerable<T> to IQueryable<T>
    }

}

Как показано выше, должен быть доступным метод расширения, который возвращает IQueryable? Почему он разрешается в IEnumerable Extensions?

Ответы [ 2 ]

6 голосов
/ 30 августа 2011

Метод расширения Queryable.Where ожидает Expression<Func<T, bool>> (т.е. дерево выражений, представляющее лямбду), а не Func<T, bool> (сама лямбда).

Это работает:

IQueryable<Test> ApplyCriteria(IQueryable<Test> queryable,
                               Expression<Func<Test, bool>> criteria)
{   //                              ↑
    return queryable.Where(criteria);
}
4 голосов
/ 30 августа 2011

IQueryable<T>.Where() работает только с Expression<Func<T, bool>> в качестве аргумента предиката.

...