2

我在运行时收到此错误消息

LINQ to Entities 无法识别方法 'Int64 Max(Int64, Int64)' 方法,并且此方法无法转换为存储表达式。

当我尝试这样做时:

return _dbContext.Appointment.Where(x => Math.Max(x.Appointment.StartTime.Ticks, startTime.Ticks) <= Math.Min(x.Appointment.EndTime.Ticks, endTime.Ticks));

这个查询背后的想法是“如果最近的开始时间在最早的结束时间之前,那么你在日期和时间上有一些重叠/接触”。

有什么办法可以让这条线正常工作吗?我已经检查过是否EntityFunctions有“东西”,但事实并非如此。

4

2 回答 2

5

Max并且Min可以像这样实现:

public static long Max(long a, long b)
{
    return a < b ? b : a;
}
public static long Min(long a, long b)
{
    return a < b ? a : b;
}

由于 LINQ to Entities可以理解 ? :,您将能够将这些内联到您的表达式中。此外,因为Ticks不支持,但DateTime比较是......

Math.Max(x.Appointment.StartTime.Ticks, startTime.Ticks)

变成

(x.Appointment.StartTime < startTime ? startTime : x.Appointment.StartTime)
于 2013-08-08T11:52:11.147 回答
2

您必须始终牢记,每个 IQueryable 提供程序都以自己的方式实现。该查询可以在 Linq to Objects 中工作(因为它不会被翻译成任何东西),但在 IQueryable 提供程序中可能会也可能不会。

在您的具体情况下,它告诉您它不知道如何将 Math.Max 和 Math.Min 转换为 SQL 命令。这是完全正确的,因为 EF 无法识别这些方法。

在我看来,完成您需要的最简单的方法是使用两个不同的查询读取最大值和最小值,然后在纯 c# 中执行您的逻辑。像这样的东西:

var min = mycontext.MyDbSet.Min(c => c.Field);
var max = mycontext.MyDbSet.Max(c => c.Field);
if (max <= min)
{
    // do something
}
于 2013-08-08T11:41:38.967 回答