我在数据库中有两个实体,它们以两种不同的格式保存DateTime; SuperLogs.EndTime
是普通的DateTime
,而SuperLogs.Logs
将DateTime保留为Year
(int
),Month
({{1} }),int
(Day
)和int
(Time
)。我想在查询中执行的操作是获得唯一的double
实体,该实体的最新Log的DateTime大于SuperLogs
的{{1}}。
我有一个C#函数(EndTime
)将superLogX
上的DateTime转换为实际的GetLogDateTime
,但是当传递给以下查询时:“ System.InvalidOperationException:Internal .NET Framework Data Provider错误1025。”被抛出。
Logs
DateTime
的实现方式如下:
var superLogNewerThanSuperLogX = await MyDbContext.SuperLogs.SingleOrDefaultAsync
(
superLog => superLog.Logs.Max<Log, DateTime>(GetLogDateTime) > superLogX.EndTime
);
我的猜测是问题的一部分,就是GetLogDateTime仅转换为GetLogDateTime
,但需要以某种方式转换为private static DateTime GetLogDateTime(Log log)
{
var time = log.Time;
var hasTime = log.Time.HasValue;
var hours = hasTime ? Math.Floor(time.Value / 10000) : 0;
var minutes = hasTime ? Math.Floor(time.Value / 100) - hours * 100 : 0;
return new DateTime
(
log.Year,
log.Month,
log.Day,
(int)hours,
(int)minutes,
hasTime ? (int)(time.Value - (hours * 10000 + minutes * 100)) : 0,
hasTime ? (int)((time.Value - Math.Truncate(time.Value)) * 1000) : 0
);
}
。我不确定该怎么做,如果不可能的话,我还有一个数据库实现的标量函数,它执行与该方法相同的任务。
Func<Log, DateTime>
但是,这也没有什么特别的帮助,因为我似乎无法让Entity Framework允许我调用它!目前,我看到的唯一可行的选择是尝试将整个查询(比此处显示的要大得多)作为存储过程移入数据库。还有另一种方法,或者这是我将被迫要做的事情吗?