我有这种通用方法:
public IQueryable<TEntity> PaginateAndOrderByDesc<TEntity>(int pageIndex, int pageSize, Expression<Func<TEntity, object>> orderByDescending)
where TEntity : class, IContextEntity
{
int numberOfRecordsToSkip = (pageIndex - 1) * pageSize;
return context.Set<TEntity>().OrderByDescending(orderByDescending).Skip(numberOfRecordsToSkip).Take(pageSize);
}
当我使用它时:
List<Person> people = repository.PaginateAndOrderByDesc<Person>(1,
30, x = > x.RegistrDate)
.ToList();
我收到错误:&#34;无法转换类型&#39; System.DateTime&#39;键入&#39; System.Object&#39;。 LINQ to Entities仅支持转换EDM原语或枚举类型。&#34;
如何使该通用功能与orderByDescending表达式一起使用?
答案 0 :(得分:4)
添加一个通用参数来表示您要订购的类型:
public IQueryable<TEntity> PaginateAndOrderByDesc<TEntity, TKey>(
int pageIndex,
int pageSize,
Expression<Func<TEntity, TKey>> sortSelector)
where TEntity : class, IContextEntity
{
int numberOfRecordsToSkip = (pageIndex - 1) * pageSize;
return context.Set<TEntity>()
.OrderByDescending(sortSelector)
.Skip(numberOfRecordsToSkip)
.Take(pageSize);
}
话虽如此,我建议不要在此查询中包含OrderBy
方法。它降低了查询的可读性,以便组合&#34;对数据进行排序&#34;并且&#34;获得某个页面&#34;操作。将它们分开。 &#34;订购数据&#34;操作就好了;你真的只需要创建一个&#34;得到一个特定的页面&#34;查询:
public static IQueryable<TEntity> GetPage<TEntity>(
this IOrderedQueryable<TEntity> query,
int pageIndex,
int pageSize)
{
int numberOfRecordsToSkip = (pageIndex - 1) * pageSize;
return query.Skip(numberOfRecordsToSkip)
.Take(pageSize);
}
除了给你更大的权力来组合你认为合适的查询之外,这更重要的是会产生更具可读性的查询,根据所调用的方法,其中发生的事情非常清楚。