C# 表情。。。LINQ to Entities仅支持转换实体数据模型基元类型”;

C# 表情。。。LINQ to Entities仅支持转换实体数据模型基元类型”;,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我有一个通用方法: public IQueryable<TEntity> PaginateAndOrderByDesc<TEntity>(int pageIndex, int pageSize, Expression<Func<TEntity, object>> orderByDescending) where TEntity : class, IContextEntity { int numberOfRec

我有一个通用方法:

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);
    }
public IQueryable分页和derbydesc(int-pageIndex、int-pageSize、Expression-orderByDescending)
其中tenty:class,i扩展
{
int numberOfRecordsToSkip=(页面索引-1)*页面大小;
返回context.Set().OrderByDescending(OrderByDescending).Skip(numberOfRecordsToSkip).Take(pageSize);
}
当我使用它时:

List<Person> people = repository.PaginateAndOrderByDesc<Person>(1,
            30, x = > x.RegistrDate)
            .ToList();
List people=repository.paginateandderbydesc(1,
30,x=>x.registerDate)
.ToList();
我收到一个错误:“无法将类型'System.DateTime'强制转换为类型'System.Object'。LINQ to Entities仅支持强制转换EDM基元或枚举类型。”


如何使泛型函数与orderByDescending表达式一起工作?

添加泛型参数以表示您正在排序的类型:

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);
}

除了让您有更大的能力根据自己的需要组合查询之外,这更重要的是,可以生成更可读的查询,根据所调用的方法,查询中发生的事情非常清楚。

非常感谢它的工作!我在网上搜索了一半,却找不到合适的解决办法。你说得对,保持简单!我很感激你花了这么多时间提到只做GetPage操作。我总是告诉自己(和其他开发人员),每当你在方法签名中使用“and”或“or”这个词时,请重新思考你在做什么,以及为什么在签名中使用条件短语。如果您使用的是条件短语,为什么它们不是单独的操作?
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);
}