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

Yul*_*ian 6 c# sql linq time entity-framework

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

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

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

Jon*_*eet 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);
Run Code Online (Sandbox Code Playgroud)

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

  • @Julian:我认为我的解决方案更清晰 - *可能*效率更高......你应该检查查询计划.我不介意你接受谁的答案,但我认为值得思考表达你想要的查询的最佳方式...... (2认同)

Kev*_*vin 8

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

你正在寻找的方法是DbFunctions.DiffMinutes.它给出了两个值之间的总分钟数.

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