Expression.Call跳过或接听

时间:2019-03-20 09:55:42

标签: c# .net entity-framework linq .net-core

我做了一些通用功能,这些功能在运行时会从 JSON过滤器编译为 Expression ,并在IQueryable上进行make Skip and Take调用时出现问题,以便全部编译(在SQL中没有 exec sp_executesql

我的方法:

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'的方法'Skip'与提供的参数不兼容。

2 个答案:

答案 0 :(得分:2)

该异常被认为是因为IQueryable接口中没有Skip方法。

您应该使用Queryable类,该类提供了一组静态方法(包括Skip)来查询实现IQueryable的数据结构。

致谢。

答案 1 :(得分:2)

Skip方法不是git diff my file.ext的实例方法,而是静态IQueryable类的扩展。

您需要获取通用方法信息,并将源查询作为第一个参数传递:

Queryable