【发布时间】:2011-12-23 19:01:28
【问题描述】:
我有具有 StartTime 和 FinishTime 属性的 Linq 类。我正在尝试将 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 的列。
在我工作的当前环境中,我无法更改数据库。有没有办法将此属性添加到我的类中并在排序查询中使用它?
谢谢!
【问题讨论】:
-
仅供参考 - 如果您调用 RunTime 属性中的设置器,它将导致 StackOverflow 异常。最好只有一个 get 访问器,而不是设置。
-
感谢您的意见。我对 C# 还是有点陌生。
标签: c# sql-server linq linq-to-objects