我有Linq类,它具有StartTime和FinishTime属性。我正在尝试将RunTime属性添加到类中,该类计算为FinishTime - StartTime。我的第一种方法是将其添加为未映射的属性,并在get()中进行计算:
[Table(Name = "Log")]
public partial class Log
{
...
[Column(Name = "Start_Time", DbType = "DateTime NOT NULL")]
public DateTime StartTime { get; set; }
[Column(Name = "Finish_Time", DbType = "DateTime NOT NULL")]
public DateTime FinishTime { get; set; }
public int RunTime
{
get { return ((TimeSpan) (this.FinishTime - this.StartTime)).Seconds; }
set { this.RunTime = value; }
}
...
}
这开始工作正常,但是当我尝试使用列在OrderBy中排序时,我收到以下错误:“成员'TestProject.Models.Log.RunTime'没有支持的SQL转换。”这是有道理的,因为此属性未映射到数据库列,所以无法在SQL中对其进行排序。
我的下一个方法是尝试将其设为具有“表达式”属性的列(我可能无法正确使用):
[Column(Expression = "DATEDIFF(ss, Start_Time, Finish_Time) AS RunTime")]
public int RunTime { get; set; }
但是这会导致错误:“无效的列名'RunTime'。”这也是有道理的,因为没有名为RunTime的列可以映射到。
在我正在工作的当前环境中,我无法更改数据库。有没有办法将此属性添加到我的类并在排序查询中使用它?
谢谢!
答案 0 :(得分:3)
如果排序不必在SQL端进行,我会假设您可以ToList()Linq / Queryable部分(将事物转换为围栏c#侧的实际列表)然后在OrderBy上结果,根据你原来的专栏。
(编辑)
好的,那么你可以按顺序进行计算吗?
IEnumerable<Log> logList = db.Logs.OrderBy(x => x.FinishTime - x.StartTime)
我以前没试过,但我不明白为什么它不起作用。