Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET LINQ到实体组的日期(天)_C#_.net_Linq_Group By_Timezone - Fatal编程技术网

C# .NET LINQ到实体组的日期(天)

C# .NET LINQ到实体组的日期(天),c#,.net,linq,group-by,timezone,C#,.net,Linq,Group By,Timezone,我在这里发布了同样的问题: 然而,答案并非100%正确。除使用不同时区外,它在所有情况下都有效。当使用不同的时区时,它还按时区分组。为什么? 通过使用许多实体函数,我成功地绕过了这个问题 int localOffset= Convert.ToInt32( TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes); var results = ( from perfEntry in db.entry

我在这里发布了同样的问题:

然而,答案并非100%正确。除使用不同时区外,它在所有情况下都有效。当使用不同的时区时,它还按时区分组。为什么? 通过使用许多实体函数,我成功地绕过了这个问题

int localOffset= Convert.ToInt32(
    TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes);

var results = (
    from perfEntry in db.entry
    where (....)
    select new { 
        perfEntry.Operation, perfEntry.Duration, 
        localTime = EntityFunctions.AddMinutes(perfEntry.Start, 
            localOffset - EntityFunctions.GetTotalOffsetMinutes(
                perfEntry.Start)) 
    }
).GroupBy(x => new { 
    Time = EntityFunctions.TruncateTime(
        EntityFunctions.CreateDateTime(x.localTime.Value.Year,
            x.localTime.Value.Month, x.localTime.Value.Day, 0, 0, 0)),
    x.Operation }
).OrderByDescending(a => a.Key).
Select(g => new {
    Time = g.Key.Time,
    ...
});
有没有人知道如何用正确的方法来做这件事?这段代码很难看,可能效率很低

更新(警告):

我还意识到函数EntityFunctions.CreateDateTime存在一个bug。它与闰年不兼容,例如今年。2012年2月29日将引发异常。

您可以使用UTC DateTime并在它之后的时间进行中继。

丑陋的代码不一定是低效的代码。是的,但这样简单的操作应该能够以更简单的方式编写?不一定。请记住,Linq to Entities必须将C#转换为SQL,这意味着它对您可以对其执行的操作有很多限制,因为没有支持该操作的SQL。EntityFunctions是专门用来处理这些限制的,所以如果你想使用它们,就必须使用它们。当然,一定有更简单的方法……在我看来,有时是编写存储过程的最简单方法。由您决定何时到达该点。您是指DateTime函数ToUniversalTime()?这在linq to实体中不起作用。您只能在linq to entities中使用少数函数和属性。LinqToEntity尝试将您的请求转换为sql查询。它无法将ToUniversalTime()转换为Sql。我建议您首先获取所有数据(例如(.ToList()),然后使用数据集合进行任何操作。在这种情况下,您可以在Linq查询中使用ToUTCTime()函数。我处理的是巨大的表和复杂的统计数据。首先获取所有数据会对性能产生影响,这是我不愿意接受的。在这种情况下,您必须使用一些sql,并将日期与sql中的UTC对齐。可以使用“视图”创建工作。当然,你会保持你的表现。此外,还可以截断视图中的时间。如果使用Dateadd和datediff函数,速度会快得多。好的,这可能是一个更好的解决方案,尽管我希望这可以在不修改数据库的情况下解决。是否有可以转换为UTC的SQLFunction?