减去两个datetime(timestamp)并与lambda查询中以小时为单位的间隔(int)进行比较

mf98qq94  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(370)

我需要做到这一点(currenttimestamp-createtimestamp)>(以小时为单位的间隔)。我用下面的代码试过,没能实现并得到一个异常。linq to entities无法识别方法“system.timespan subtract(system.datetime)”方法,并且此方法无法转换为存储表达式

DateTime now = DateTime.Now - new TimeSpan(0, 1, 0) + new TimeSpan(0, 1, 0);
return query.Where(m => now.Subtract(m.create_timestamp) >= m.interval);
kse8i1jr

kse8i1jr1#

我认为linqto实体不能将timespan的比较转换为sql查询。也许您应该使用system.data.entity中的dbfunctions来比较时间跨度,或者使用ef core。
这是使用dbfunctions的示例

DateTime now = DateTime.Now - new TimeSpan(0, 1, 0) + new TimeSpan(0, 1, 0);
return query.Where(m => DbFunctions.DiffSeconds(now,m.create_timestamp).Value >= m.interval.TotalSeconds);
ecbunoof

ecbunoof2#

为什么不使用datetime.compare?文件

var now = DateTime.Now;
var removeMins = now.Subtract(TimeSpan.FromMinutes(2));
//var addMins = now.Add(TimeSpan.FromMinutes(2));
var result = DateTime.Compare(now, removeMins);
if (result < 0)
{  
   Console.WriteLine($"Now({now}) is earlier than removeMin({removeMins})");
   //return query.Where(m => m.date == now);
}
else if (result == 0)
{
 Console.WriteLine($"Now({now}) is equal to removeMin({removeMins})");   
}
else
{
Console.WriteLine($"Now({now}) is later than  removeMin({removeMins})");
 //return query.Where(m => m.date == removeMins);
}
hfyxw5xn

hfyxw5xn3#

DateTime todayDate = DateTime.Now;
TimeSpan difference = inputDate- todayDate;
Console.WriteLine(difference.Hours);
Console.WriteLine(difference.Days);
Console.WriteLine(difference.Minutes);
bogh5gae

bogh5gae4#

只要你连接 IQueryable<...> linq语句,属性 Expression iqueryable的属性已更改。只有在执行iqueryable(使用tolist、foreach、firstordefault、any等)时,表达式才会发送到 IQueryable<...>.Provider 谁将在执行查询之前将表达式转换为sql。
异常消息表示您的提供商不知道 DateTime.Subtract . 这在一定程度上取决于您使用的提供者(microsoft、sqlite、mysql、mongo等等),但大多数提供者都不知道“datetime.subtract”。
熟悉受支持和不受支持的linq方法(linq到实体)的列表,以及dbfunctions类。后者包含几种使用时间跨度进行计算的方法。
显然,您现在需要createtimestamp+interval<=的所有项

query.Where(item => item.create_timestamp + item.interval <= now);

如果您的提供商不支持此功能,请考虑使用 DbFunctions.AddSeconds 以及 DbFunctions.DiffSeconds (或毫秒,或天,任何你需要的分辨率。

相关问题