C#使用Linq映射计算列

时间:2011-12-23 19:01:29

标签: c# sql-server linq linq-to-objects

我有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的列可以映射到。

在我正在工作的当前环境中,我无法更改数据库。有没有办法将此属性添加到我的类并在排序查询中使用它?

谢谢!

1 个答案:

答案 0 :(得分:3)

如果排序不必在SQL端进行,我会假设您可以ToList()Linq / Queryable部分(将事物转换为围栏c#侧的实际列表)然后在OrderBy上结果,根据你原来的专栏。

(编辑)

好的,那么你可以按顺序进行计算吗?

IEnumerable<Log> logList = db.Logs.OrderBy(x => x.FinishTime - x.StartTime)

我以前没试过,但我不明白为什么它不起作用。