首先是EF代码和Paging

时间:2015-09-01 17:04:35

标签: entity-framework ef-code-first

我们首先使用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;
        }

任何帮助表示赞赏..

1 个答案:

答案 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