如何比较LINQ中的TimeSpan与实体的分钟部分?

时间:2014-08-18 14:19:28

标签: c# sql linq entity-framework time

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

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

尝试执行上述语句,我得到以下异常:“DbArithmeticExpression参数必须具有数字公共类型。”。我试图从DbFunctions类中寻找合适的函数,但没有成功。任何人都可以提出解决方案吗?

2 个答案:

答案 0 :(得分:13)

不要在查询中执行算术 - 在查询之前执行,这样您基本上就可以指定“最早的发布创建时间”:

// 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

答案 1 :(得分:7)

好的,我收到了Skeeted但是加入了对话,有点可能对其他人有用......

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

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