【问题标题】:LINQ to Entities does not recognize the method 'Int64 Max(Int64, Int64)' method, and this method cannot be translated into a store expressionLINQ to Entities 无法识别方法 'Int64 Max(Int64, Int64)' 方法,并且该方法无法转换为存储表达式
【发布时间】:2013-08-08 11:31:42
【问题描述】:

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

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 是否有“东西”,但事实并非如此。

【问题讨论】:

    标签: c# linq-to-entities runtime-error


    【解决方案1】:

    MaxMin 可以这样实现:

    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 understands ? :,您将能够将这些内联到您的表达式中。另外,由于不支持Ticks,但DateTime比较...

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

    变成

    (x.Appointment.StartTime < startTime ? startTime : x.Appointment.StartTime)
    

    【讨论】:

    • 似乎 Matteo Mosca 的例子是要走的路。这是我使用您的示例得到的下一个运行时错误消息:“LINQ to Entities 不支持指定的类型成员 'Ticks'。仅支持初始化程序、实体成员和实体导航属性。” System.Exception {System.NotSupportedException}。
    • 我已经测试过了,这个查询似乎没有返回我预期的结果。我必须为此使用第 3 方库。谢谢你的帮助! +1
    【解决方案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
    }
    

    【讨论】:

    • 但在您的示例中,Min 和 Max 仅选择一个“字段”。我需要知道哪一个是 2 个字段中较大的一个。存储在数据库中的开始时间和开始时间作为参数传递。结束时间也是如此。我将如何通过您的示例实现这一目标?
    • 正如我所提到的,从 db 中获取您需要的内容,并在 db 上下文之外在 c# 中进行所有其他计算。如果 EF 无法将您打算做的事情翻译成 SQL 命令,那是唯一的方法。
    • 我误解了你的例子。所以我需要从数据库中选择 2 个DateTime 字段并将其与传递的参数进行比较。
    • 是的,没错。我的代码只是概念验证,而不是最终解决方案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多