Expression.Call Пропустить или взять - PullRequest
1 голос
/ 20 марта 2019

Я сделал общую функциональность, которая во время выполнения компилируется из JSON-фильтра в Выражение , и у меня возникла проблема при вызове make Skip and Take на моем IQueryable, чтобы он был полностью скомпилирован (без exec sp_executesql ) в SQL

Мой метод:

public static class PagingExtensions
{
    public static IQueryable<T> Page<T>(this IQueryable<T> query, QueryRequest queryRequest) where T : class
    {
        //if (queryRequest.Skip.HasValue)
        //{
          //query = query.Skip(queryRequest.Skip.Value);
        //}

        //if (queryRequest.Take.HasValue)
          //{
            //query = query.Take(queryRequest.Take.Value);
        //}
        var methodName = "Skip";
        var resultExp = Expression.Call(
            typeof(IQueryable),
            "Skip",
            Type.EmptyTypes,
            Expression.Constant(queryRequest.Skip.Value));

        query = query.Provider.CreateQuery<T>(resultExp);


        return query;
    }
}

Исключение:

InvalidOperationException: ни один метод «Пропустить» для типа «System.Linq.IQueryable» не совместим с предоставленными аргументами.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Метод Skip не является методом экземпляра IQueryable, но является расширением в статическом Queryable классе.

Вам необходимо получить общую информацию о методе и передать исходный запрос в качестве первого аргумента:

MethodInfo method = typeof(Queryable).GetMethod("Skip").MakeGenericMethod(typeof(T));
var resultExp = Expression.Call(
                       method,
                       query.Expression, 
                       Expression.Constant(queryRequest.Skip.Value));
2 голосов
/ 20 марта 2019

Это исключение, потому что в интерфейсе IQueryable нет метода Skip.

Вы должны использовать класс Queryable , который предоставляет набор статических методов (включая Пропуск) для запроса структур данных, реализующих IQueryable.

С уважением.

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