我们首先使用EF 6.1和代码以及工作单元和存储库模式。
我们面临的困惑是,在许多地方,如果我们使用Skip
&在Dbset上Take
,会自动处理分页。
但是当我们看到正在创建查询时,它不包含任何分页子句。
请协助可能的案例,示例代码如下:
public virtual IEnumerable<TEntity> GetSorted(Func<TEntity, Object> order,int skip, int take, params Expression<Func<TEntity, object>>[] includes)
{
IQueryable<TEntity> query = dbSet;
foreach (var include in includes)
{
query = dbSet.Include(include);
}
IEnumerable<TEntity> data = dbSet.OrderBy(order).Skip(skip).Take(take).ToList();
//IEnumerable<TEntity> data = query.OrderBy(order).Skip(skip).Take(take).ToList();
return data;
}
任何帮助表示赞赏..
答案 0 :(得分:2)
您的order
参数必须为Expression<Func<TEntity, TSortBy>>
类型才能匹配Queryable.OrderBy()
的签名。当您传递代理人(Func<TEntity, Object>
)时,与此参数匹配的唯一OrderBy()
重叠是Enumerable.OrderBy()
,而不是您Queryable.OrderBy()
期待(当然都是扩展方法)。
当Enumerable.OrderBy()
(Linq-to-Objects)完成排序时,必须首先执行查询(因为Linq-to-Objects用于处理已经在内存中的对象)。< / p>
但是,当调用Queryable.OrderBy()
时,order-by表达式将传递给Linq提供程序,然后该提供程序能够解析并将其转换为存储查询(在本例中为SQL)。
因此,当您将Func<TEntity, Object>
传递给OrderBy
时,您获得IEnumerable<TEntity>
作为回报,并进一步(链式)调用Skip()
Linq-To-Entities不再拦截Take()
。
这是方法签名的样子:
public virtual IEnumerable<TEntity> GetSorted<TSortedBy>(Expression<Func<TEntity, TSortedBy>> order, int skip, int take, params Expression<Func<TEntity, object>>[] includes)
请参阅MSDN