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

abstract class RepositoryBase<T> {
    void Add();
    void Delete();
    void SaveChanges();
}

我想添加另一种方法来自动分页 IQueryable<T> 并从结果中返回 List<T>:
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();
}

但是, Skip 需要 IOrderedQueryable<T> 的源。我尝试将方法签名更改为:
Paginate(IOrderedQueryable<T> content, int? skip, int? take)

但是 Skip 返回一个 IQueryable<T> 所以我收到错误 Cannot convert source type 'System.Linq.IQueryable<T>' to target type 'System.Linq.IOrderedQueryable<T>'
如何强制实现类向我的方法发送 IOrderedQueryable<T> 并使我的分页方法起作用?

最佳答案

听起来您可能希望 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();
}

正如 Marc 所说,将 Take 行更改为:
if (take.HasValue) result = result.Take(take.Value);

关于c# - IOrderedQueryable 跳过,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21551777/

10-10 18:13