2009-08-31 97 views
5
  • 如何通过实体框架从日期时间字段获取平均时间?
  • 如何从另一个中减去一个日期?

我想到的是这样的:从DB获取平均日期时间并从另一个日期时间减去一个日期

ObjectQuery<Visit> visits = myentitys.Visits; 
      var uQuery = 
      from visit in visits 
      group visit by visit.ArrivalTime.Value.Day into g 
      select new 
      { 
       Day = g.Key, 
       Hours = g.Average(visit => (visit.LeaveTime.Value - visit.ArrivalTime.Value).TotalMinutes) 
      }; 

获得由天分组的游客的平均停留时间。

回答

1

我宁愿从数据库中获取数据,然后在内存中做平均函数。 Altough我不知道这可能是对perfomances影响...

  List<Visit> visits = myentitys.Visits.ToList();//Get the Visits entities you need in memory, 
              //of course,you can filter it here 
      var uQuery = 
      from visit in visits 
      group visit by visit.ArrivalTime.Value.Day into g 
      select new 
      { 
       Day = g.Key, 
       Hours = g.Average(visit => (visit.LeaveTime.Value - visit.ArrivalTime.Value).TotalMinutes) 
      }; 

这种运算是不可能在SQL查询翻译(如异常说:DbArithmeticExpression参数必须有一个数字普通型),但它可能与内存中的对象有关。

希望这会有所帮助。

+1

我更喜欢这个;你并没有把自己绑定到SQL函数上。我不确定你为什么被拒绝。 – 2010-03-08 10:05:49

+0

+ 1,@柯克+1,我宁愿在有关非SQL服务器所需的选项最后知道的好。 – Maslow 2010-11-06 14:29:53

7

这是你如何做到这一点,假设你的后备存储是SQL Server。顺便说一下,我纠正了我认为是一个错字 - 您将总分钟数分配到一个名为Hours的字段中。为了未来受众的目的,我将该字段重命名为Minutes。

ObjectQuery<Visit> visits = myentitys.Visits; 
var uQuery = from visit in visits 
      group visit by visit.ArrivalTime.Value.Day into g 
      select new 
      { 
       Day = g.Key, 
       Minutes = g.Average(visit => System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", visit.LeaveTime.Value, visit.ArrivalTime.Value)) 
      }; 

令人失望的是LINQ实体不支持的DateTime减法的固有转换成则DateDiff然后产生时间间隔对象作为结果。

+0

+1有用的答案。 – Maslow 2010-11-06 14:31:24

+1

对于“令人失望的是LINQ to Entities不支持DateTime的内在转换” – billy 2011-06-21 17:22:13