gpt4 book ai didi

c# - 表达式... LINQ to Entities 仅支持转换实体数据模型原始类型”

转载 作者:行者123 更新时间:2023-11-30 14:56:18 24 4
gpt4 key购买 nike

我有这个通用方法:

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

最佳答案

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

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 方法。将“排序数据”和“获取特定页面”操作结合起来会降低查询的可读性。将它们分开。 “订购数据”操作就这样就好了;你真的只需要创建一个“获取特定页面”查询:

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

除了赋予您更大的权力来按照您认为合适的方式编写查询之外,更重要的是,这会导致查询更具可读性,根据调用的方法,查询中发生的事情非常清楚。

关于c# - 表达式... LINQ to Entities 仅支持转换实体数据模型原始类型”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23202333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com