【发布时间】:2014-02-04 11:53:11
【问题描述】:
我的所有存储库都继承自以下抽象类:
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> 并让我的分页方法工作?
【问题讨论】:
-
Skip的哪个版本要求(在编译时)源是IOrderedQueryable?Queryable.Skip不... -
@JonSkeet LINQ to Entites -
The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'- 除非我误解了错误。 -
这很奇怪 - 因为如果你有
using System.Linq;它应该采用这种方法 - msdn.microsoft.com/en-us/library/bb357513(v=vs.110).aspx -
附带说明,如果我打电话给
Paginate(query, null, 20)并且它没有应用,我会觉得很奇怪。我不认为第二行的skip.HasValue检查是直观或明显的。 -
@RGraham 确认:您可以使用
Take而不使用Skip
标签: c# linq entity-framework-5 iqueryable