【发布时间】: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