【问题标题】:Return Timespan ticks difference in LINQ queriesLINQ 查询中的返回时间跨度刻度差异
【发布时间】:2014-11-11 17:54:42
【问题描述】:

我正在查询一个对象列表,我想返回一个 TimeSpan 的刻度列表,其中包含对象中注册的时间与现在之间的差异。

我想要一个表达,所以:

var list = (from r in res where r.Site == "CNIS"
    select Math.Abs((r.Timestamp.Value - DateTime.Now).Ticks)).ToList();

但我收到以下错误:

异常详情: DbArithmeticExpression 参数必须具有数字通用类型

我已经设法解决了。例如,我的代码现在如下所示:

var list = new List<long>();
foreach(var item in (from r in res where r.Site == "CNIS" select r))
    list.Add(Math.Abs((item.Timestamp.Value - DateTime.Now).Ticks));

但我真正想知道的是,在单个 LINQ 查询中是否可以获取从 DateTime 值到现在的时间跨度差异

【问题讨论】:

  • 此 linq 是对象还是 EF 或 SQL ?
  • res 是一个 EF 实体的 IQueryable&lt;&gt;...

标签: c# linq


【解决方案1】:

似乎该错误与将您的 select 语句转换为 SQL 相关。如果将结果表单 DB 生成不是问题,您可以使用 AsEnumerable 来完成,然后投影项目:

var now = DateTime.Now;
var list = res.Where(r => r.Site == "CNIS")
           .AsEnumerable()
           .Select(x => Math.Abs((x.Timestamp.Value - now).Ticks))
           .ToList();

由于DateTime.Now 的值发生了变化,您可能应该将它存储到一个变量中并在计算中使用它。

【讨论】:

  • 谢谢,它有效! - 请注意:在 select 语句中,您使用的是 item,它应该是 x。 (我知道你可能没有调试它......没问题。非常感谢......)
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多