我正在使用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>();