表达式...... LINQ to Entities仅支持转换实体数据模型基元类型“

时间:2014-04-21 17:23:56

标签: 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 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表达式一起使用?

1 个答案:

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

除了给你更大的权力来组合你认为合适的查询之外,这更重要的是会产生更具可读性的查询,根据所调用的方法,其中发生的事情非常清楚。