【问题标题】:How to compare minutes portion only of a TimeSpan in LINQ to Entities?如何仅比较 LINQ to Entities 中 TimeSpan 的分钟部分?
【发布时间】:2014-08-18 14:19:27
【问题描述】:

我的模型中有一个发布实体。我想检索从现在开始不到 10 分钟创建的所有出版物。

var publications = myEntities.Publications.
    .Where(p => p.CreationUserId == exampleId
             && (DateTime.Now - p.CreationDate).Minutes < 10);

尝试执行上述语句时,我得到以下异常:“DbArithmeticExpression arguments must have a numeric common type.”。我试图从 DbFunctions 类中寻找合适的函数,但没有成功。有人可以提出解决方案吗?

【问题讨论】:

标签: c# sql linq entity-framework time


【解决方案1】:

不要在查询中进行算术运算 - 在查询之前进行,这样您就基本上指定了“最早的出版物创建时间”:

// Deliberate use of UtcNow - you should almost certainly be storing UTC, not
// local time...
var cutoff = DateTime.UtcNow.AddMinutes(-10);
var publications = myEntities.Publications
                             .Where(p => p.CreationUserId == exampleId &&
                                         p.CreationDate >= cutoff);

请注意,即使您的原始查询确实有效,它也不会执行您想要的操作 - 它会返回 0-10 分钟前、60-70 分钟前、120-130 分钟前创建的出版物之前等。你想要的是TotalMinutes

【讨论】:

  • 非常感谢您的回答!但是,我将 Kevin 的回答标记为已接受,因为他的回答正是我想要的。顺便说一句,由于您的回答也是正确的,所以我投了赞成票。希望你不要生我的气;)再次感谢!
  • @Julian:我认为我的解决方案更清晰 - 而且 可能 效率也明显更高......您应该检查查询计划。我不介意你接受谁的答案,但我认为值得考虑表达你想要的查询的最佳方式......
【解决方案2】:

好的,我得到了 Skeeted,但要添加到对话中并添加一些可能对其他人有用的内容...

您要查找的方法是DbFunctions.DiffMinutes。它给出了两个值之间的总分钟数。

var publications = myEntities.Publications.
    .Where(p => p.CreationUserId == exampleId
             && DbFunctions.DiffMinutes(p.CreationDate, DateTime.Now) < 10);

【讨论】:

  • 我只会在比较两列 datetime 时使用 DbFunctions,而不是一列和一列传入的值
  • 实际上,我得到了我想要的结果。我创建了一些发布实体,其创建日期是从现在起 60-70 或 120-130 分钟,它们不属于集合的一部分。顺便说一句,您应该像这样更改两个日期的位置 DbFunctions.DiffMinutes(p.CreationDate, DateTime.Now)
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多