C# 如何使用LINQ to实体将DateTime字段划分为间隔?
我有以下代码行:C# 如何使用LINQ to实体将DateTime字段划分为间隔?,c#,linq,entity-framework,sybase,C#,Linq,Entity Framework,Sybase,我有以下代码行: group p by new DateTime((p.DateTime.Value.Ticks / interval.Ticks) * interval.Ticks).TimeOfDay 这在LINQ to对象中非常有效,但在LINQ to实体中不起作用。我有两个任务: 它为什么有效?我不明白如何将时间除以一个时间间隔,然后再乘以这个时间间隔,神奇地将我的12:37转换为12:30。我的数学基本经验是:(A/B)*B=A。(由@spencer在评论中澄清。非常感谢!) 如何
group p by new DateTime((p.DateTime.Value.Ticks / interval.Ticks) * interval.Ticks).TimeOfDay
这在LINQ to对象中非常有效,但在LINQ to实体中不起作用。我有两个任务:
- 它为什么有效?我不明白如何将时间除以一个时间间隔,然后再乘以这个时间间隔,神奇地将我的12:37转换为12:30。我的数学基本经验是:(A/B)*B=A。(由@spencer在评论中澄清。非常感谢!)
- 如何重新格式化此行以在LINQ to实体中工作
DateTime? start=new DateTime(2000,1,1); //start of first interval
...group p by
EntityFunctions
.AddSeconds(
start,
(EntityFunctions
.DiffSeconds(p.DateTime,start)/60)*60
)
错误的假设<代码>(A/B)*B在处理整数除法时不一定等于
A
。e、 g.(3/2)*2==2
,因为3/2在现实世界中实际上等于1.5,但在整数域中被截断为1。@spender Ok,那么如何将时间值除以一个间隔,然后再乘以该间隔,最终得到我想要的结果呢?它真的让我很烦恼,有些东西在工作,但不知道它是如何从A到B的。如上所述。我想知道3在2秒的时间片上的位置。因此(3/2)*2得到2,这将是该切片的开始。@spender lol,哇。出于某种原因,我不明白那个简单的事实。我想,“嗯……是的,它是。(A/B)*B总是等于A。”这是一种过度思考,没有考虑到结果会被截断。这看起来很有趣:嗯,我确定我必须使用EntityFunctions.CreateDateTime或EntityFunctions.DiffSomething之类的东西,但我不确定如何转换当前的新日期时间(滴答声)EntityFunction格式的内容。我自己在这里有点不知所措,但我在上面虚张声势地回答了一个问题!你可能需要使用CreateDateTime来代替开始
,也许是在let
子句中。是的,我已经玩弄了一两天了很多不同的想法,但似乎没有想出有效的方法。我尝试了d你的,但没有得到我需要的结果。算出了,你非常接近:EntityFunctions.AddSeconds(start,(EntityFuctions.DiffSeconds(start,p.DateTime)/1800)*1800)
我的数据库的“start”是newdatetime(1970,1,1,0,0,DateTime.Utc)
。我不知道是因为p.DateTime出现在开始之前,还是因为我没有正确设置开始字段,而第一次不起作用,但现在起作用了。