日期:2014-05-20  浏览次数:20754 次

对Linq进行一些扩展,传参数的问题
本帖最后由 z1101385391 于 2013-07-14 12:06:20 编辑

/// <summary>
        /// 对查询结果进行Sql语句级别的分页
        /// </summary>
        /// <param name="source"></param>
        /// <param name="pageIndex">要获取第几页的数据,从0开始计数</param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public static PageResult Page<TSource>(this IQueryable<TSource
> source, int pageIndex, int pageSize)
        {
            return (PageResult)source.Provider.Execute(Expression.Call(null,
((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[] { typeof(TSource) }),
new Expression[] { source.Expression,
Expression.Quote(Expression.Lambda(Expression.Constant(pageIndex))), 
Expression.Quote(Expression.Lambda(Expression.Constant(pageSize))) }));
        }

我希望这个函数能像普通的Linq查询那样进行查询,类似于List.Page(1,2),而不是 from c in c Page`````
看了微软的源码,发现只是针对 IQueryable这个接口写了扩展方法,所以我找到了.Where的扩展方法,搬过来大致改了一下,就像上面这样。我希望能够把那两个int型参数传过去进行表达式树的分析。编译没错,运行错了,提示:
类型为“System.Linq.Expressions.Expression`1[System.Func`1[System.Int32]]”的表达式不能用于方法“Xinchen.DataBase.PageResult Page[<>f__AnonymousType0`2](System.Linq.IQueryable`1[<>f__AnonymousType0`2[System.Nullable`1[System.Int32],System.Nullable`1[System.DateTime]]], Int32, Int32)”的类型为“System.Int32”的参数

该怎么解决 ?

------解决方案--------------------
public static IQuery<TSource> Page<TSource>(this IQueryable<TSource> source, int pageIndex, int pageSize)
{
    return source.Skip((pageIndex - 1) * pageSize).Take(pageSize); 
}
不就完了