【问题标题】:Entity Framework Min Aggregate crashes on website but runs on console app?Entity Framework Min Aggregate 在网站上崩溃但在控制台应用程序上运行?
【发布时间】:2015-08-28 14:38:12
【问题描述】:

我在下面有这个 Linq To Entites 查询。当我从控制台应用程序执行此查询时,它会生成 SQL 并完美执行。

但是当我从 Web 应用程序执行它时,我收到一条错误消息,指出 Min() 函数无法被 Linq To Entites 识别,并且无法转换为存储表达式。

这是完全相同的查询。两个项目在其配置文件中具有相同的设置(关于 EF 6),并且它们引用相同的程序集。

from ce in db.CustomEvents
where ce.fld_start > DateTime.Now
group ce by ce.fld_ownerId into g
select new
{
    fld_ownerId = g.Key,
    next_appointement_date = g.Min(i => i.fld_start)
}

似乎只有当 Min 聚合位于 DateTime 属性上时才会发生这种情况。例如,当我在小数上使用 Min 时,我就没有这个问题。

我在网站上执行此操作时收到的错误消息是这样的

LINQ to Entities does not recognize the method 'System.Nullable`1[System.DateTime]
Min[CustomEvent](System.Collections.Generic.IEnumerable`1[CustomEvent],
System.Func`2[CustomEvent,System.Nullable`1[System.DateTime]])'
method, and this method cannot be translated into a store expression.

但是当我从控制台应用程序执行它时,它成功生成了下面的 SQL 语句

SELECT
1 AS [C1],
[GroupBy1].[K1] AS [fld_ownerId],
[GroupBy1].[A1] AS [C2]
FROM ( SELECT
    [Extent1].[fld_ownerId] AS [K1],
    MIN([Extent1].[fld_start]) AS [A1]
    FROM [dbo].[mtbl_CustomEvent] AS [Extent1]
    WHERE [Extent1].[fld_start] > (SysDateTime())
    GROUP BY [Extent1].[fld_ownerId]
)  AS [GroupBy1]

有人知道发生了什么吗?为什么相同的查询在控制台应用程序中运行时生成 SQL,但在网站中运行时失败并出现异常??

更新:

似乎问题在于Min<T>(this IEnumerable<T>) 的两个不同实现之间的歧义(.net 的实现和我们自己的实现)。删除“使用OurLibrary;”文件中的命名空间解决了问题。

【问题讨论】:

  • 控制台应用程序和 Web 应用程序的目标是同一版本的 .net 吗?
  • 当您附加到 w3 并逐步执行查询时,您是否也有同样的问题?
  • 是的,两者都是同一个解决方案中的项目。 .net 4.5.1,EF6。我打开一个 DbContext,最后使用 .ToList() 执行查询,然后处理 DbContext。附加调试器时,我遇到了同样的问题。没有不同。但是当我取一个小数属性的 Min 而不是 DateTime 属性时,我没有这个问题。对我来说似乎很奇怪。可能是错误?
  • 你能检查一下不可为空的日期时间是否相同吗?
  • @vittore 您的评论帮助很大!问题是两个不同的“Min”实现之间的歧义。 .net 实现和我们自己的一个库中的一个实现(我们使用这个实现来实现 Linq 表达式的 .net2.0 兼容性,当我们将库移动到 .net 4 时显然忘记删除该实现)。当我们使用 linq 语法时编译器似乎忽略了这个错误,但是当我们使用扩展方法语法时它停止编译。

标签: entity-framework linq-to-sql linq-to-entities entity-framework-6 dbcontext


【解决方案1】:

在 vittore 建议使用扩展方法语法后,我们发现问题在于,在 Web 项目中,我们引用了包含 Min<T>(this IEnumerable<T>) 实现的库之一,并且我们在文件中还有 using OurLibrary.Namespace; 指令linq 查询是。

当我们使用 linq 语法时,编译器为查询选择了我们的 Min 实现,并且没有抛出任何错误。然后,在运行时,LINQ to Entities 框架崩溃了,因为它无法识别我们的 Min 实现。

from ce in db.CustomEvents
where ce.fld_start > DateTime.Now
group ce.fld_start by ce.fld_ownerId into g
select new
{
    fld_ownerId = g.Key,
    next_appointement_date = g.Min()
}

这里没有编译器错误。

但是当我们使用扩展方法语法时,编译器停止并出现歧义错误,这就是我们识别问题的方式。

db.CustomEvents
.Where(ce => ce.fld_start > DateTime.Now)
.GroupBy(ce => ce.fld_ownerId, ce => ce.fld_start)
.Select(g => new { g.Key, next_appointement_date = g.Min() })

这里编译器抛出了一个模糊调用.Min的错误

编译器无法识别 Linq 语法中的歧义,这很奇怪。毕竟,linq 只是语法糖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多