表示LINQ to Entitys仅支持强制转换实体数据模型基元类型”

本文关键字:数据模型 实体 类型 转换 to LINQ Entitys 支持 表示 | 更新日期: 2023-09-27 17:59:24

我有一个通用方法:

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

我收到一个错误:"无法将类型"System.DateTime"强制转换为类型"System.Object"。LINQ to Entities只支持强制转换EDM基元或枚举类型。"

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

表示LINQ to Entitys仅支持强制转换实体数据模型基元类型”

添加一个通用参数来表示您要订购的类型:

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方法。将"排序数据"answers"获取某个页面"操作组合在一起会降低查询的可读性。把它们分开。"对数据进行排序"操作就是这样;你真的只需要创建一个"获取特定页面"查询:

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

除了赋予您更大的能力来撰写您认为合适的查询外,更重要的是,这会产生更可读的查询,其中发生的事情基于调用的方法非常清楚。