IOrderedQueryable Skip and Take

Cod*_*gue 3 c# linq iqueryable entity-framework-5

我有以下抽象类,我的所有存储库都继承自:

abstract class RepositoryBase<T> {
    void Add();
    void Delete();
    void SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我想添加另一种方法来自动分页IQueryable<T>List<T>从结果中返回a :

protected List<T> Paginate(IQueryable<T> content, int? skip, int? take)
{
    if (skip.HasValue) content = content.Skip(skip.Value);
    if (skip.HasValue && take.HasValue) content = content.Take(take.Value);
    return content.ToList();
}
Run Code Online (Sandbox Code Playgroud)

但是,Skip要求来源IOrderedQueryable<T>.我尝试将方法签名更改为:

Paginate(IOrderedQueryable<T> content, int? skip, int? take)
Run Code Online (Sandbox Code Playgroud)

Skip返回一个,IQueryable<T>所以我收到错误Cannot convert source type 'System.Linq.IQueryable<T>' to target type 'System.Linq.IOrderedQueryable<T>'

如何强制实现类发送我的方法IOrderedQueryable<T>并使我的paginate方法工作?

Jon*_*eet 6

听起来你应该Paginate仍然需要IOrderedQueryable<T>编译时进行验证,你已经开始使用已经订购的东西 - 但是你不需要分配回同一个变量.例如:

protected List<T> Paginate(IOrderedQueryable<T> content, int? skip, int? take)
{
    // Different variable type so that we can assign to it below...
    IQueryable<T> result = content;
    if (skip.HasValue) result = result.Skip(skip.Value);
    if (skip.HasValue && take.HasValue) result = result.Take(take.Value);
    return result.ToList();
}
Run Code Online (Sandbox Code Playgroud)

正如Marc所说,将Take线路更改为:

if (take.HasValue) result = result.Take(take.Value);
Run Code Online (Sandbox Code Playgroud)