【问题标题】:C# Mapping a Calculated Column with LinqC# 使用 Linq 映射计算列
【发布时间】: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


【解决方案1】:

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

(编辑)

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

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

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

【讨论】:

  • 嗨,迈克布。你触及了我问题的根源!我正在使用分页表 (jqGrid) 中的数据,因此排序需要在 SQL 端进行才能有效。
  • 该解决方案适用于一些特殊情况处理。我的查询设置可以按 jqGrid 提供的任何列进行排序,所以我只需要在我的逻辑中添加一个特殊情况来执行此操作并选择 OrderBy 或 OrderByDescending。
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2018-01-22
  • 2021-01-15
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 2014-12-13
相关资源
最近更新 更多