【发布时间】:2021-02-02 16:43:28
【问题描述】:
我有一个类似的模型:
Public class Item {
public int Id { get; set; }
public string Name { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
public int? TotalTime
{
get
{
return Convert.ToInt32(EndTime.Value - StartTime.Value).TotalMinutes);
}
}
etc...
然后我得到一个项目列表:
IQueryable<Items> items = itemsContext.Items.Where(e => e.Id > 0);
我做了一些计算,运行了一些其他代码,最后我想返回按 Name ASC 和 TotalTime DESC 排序的 Items 列表。这是我尝试过的:
items = items.OrderBy(e => e.Name).ThenByDescending(e => e.TotalTime);
但我得到一个错误:“无法翻译 LINQ 表达式。要么以可翻译的形式重写查询,要么通过插入对 AsEnumerable()、AsAsyncEnumerable 的调用显式切换到客户端评估()、ToList() 或 ToListAsync()。”
我也试过这个,但得到同样的错误:
items = items.OrderBy(e => e.Name).ThenByDescending(e => e.TotalTime ?? 0);
如何按 TotalTime 对我的数据集进行排序?
【问题讨论】:
-
不要那样做。 TotalTime 属性无法计算一个服务器,因为 EF 看不到表达式树,只是属性调用。隐藏在属性 getter 下的代码。所以 EF 不能翻译这个表达式,
-
顺便说一句,避免使用
Convert.ToInt32,因为它不能让您控制错误处理。您可以安全地将TimeSpan.TotalMinutes直接转换为Int32。 -
对于此类记录内计算,将计算列添加到数据库并将其映射到计算后的 EF 模型始终是最佳选择。
标签: c# entity-framework linq asp.net-core .net-core