我在下面有这个Linq To Entites查询。当我从控制台应用程序执行此查询时,它会生成SQL并完美执行。
但是当我从Web应用程序执行它时,我收到一条错误消息,指出Linq To Entites无法识别Min()函数,并且无法将其转换为商店表达式。
完全相同的查询。两个项目在其配置文件中都具有相同的设置(关于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.
但是当我从Console应用程序执行它时,它成功生成了
下面的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&#39; s实现,以及我们自己的实现)。使用OurLibrary删除&#34;&#34;文件中的命名空间修复了问题。
答案 0 :(得分: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只是语法糖。