LINQ to SQL将服务器时间转换为本地时间

时间:2014-11-19 09:27:33

标签: datetime linq-to-sql

我正在使用LINQ to SQL查询,以便从数据库中检索对象列表。查询非常大,并且在不同的表之间进行了多次计算和连接。

在检索多个数据之前,我想检查对象日期是否等于或大于用户的localTime。为此,我创建了一个基于TimeZoneId的字典,找到每个时区的偏移量。然后我尝试将偏移量添加到服务器时间以获取localTime。但是当我尝试向serverTime添加小时时,会发生以下错误:

  

无法翻译表达式' Invoke(值(System.Func`1 [System.DateTime]))。AddHours(转换(<> h__TransparentIdentifier41.offset))'进入SQL并且不能将其视为本地表达式。

我知道错误是由偏移值引起的。但我不知道如何修复它或如何将LINME转换为SQL中从Db检索到的每个对象的serverTime转换为localTime。我想在查询中执行此操作以避免额外的foreach循环。

使用过的代码示例如下所示。

 public static Func<DataContext, int, DateTime?> GetLastDataQuery =
            CompiledQuery.Compile((DataContext db, int ID) =>
                (from obj in db.Objects
                 where obj.ID == ID 
                 select (DateTime?)obj.Date).Max());

        Dictionary<string, int> localTimesOffsets = TimezoneUtils.GetSystemTimeZones().ToDictionary(t => t.Id, t => t.BaseUtcOffset.Hours);
        DateTime serverTime = DateTime.Now;

        List<GridEntity> entities = (from obj in db.Object

                                              let lastDate = GetLastDataQuery (db, obj.ID) 

                                               let offset = localTimesOffsets[plant.TimeZoneID]
                                               let localTime = (DateTime)serverTime.AddHours((double) offset)

                                               select new Entity
                                               {
                                                   ID = obj.ID,
                                                   Name = obj.Name,
                                                   Owner = obj.Owner,
                                                   Street = obj.Street,
                                                   PostCode = obj.PostCode,
                                                   Town = obj.Town,
                                                   CountryID = obj.CountryID,
                                                   Status = plant.StatusID,
                                                   TodaysHighestStatusLevel = plant.TodaysHighestStatusLevel,

                                                   CalculatedVales = (lastDate.Date < localTime.Date) ? 0 : calculatedValue,



                                               }).OrderBy(obj => obj.Name).ToList<GridEntity>();

0 个答案:

没有答案