Entity framework 实体框架最小聚合在网站上崩溃,但在控制台应用程序上运行?

Entity framework 实体框架最小聚合在网站上崩溃,但在控制台应用程序上运行?,entity-framework,linq-to-sql,linq-to-entities,entity-framework-6,dbcontext,Entity Framework,Linq To Sql,Linq To Entities,Entity Framework 6,Dbcontext,我在下面有一个Linq To Entites查询。当我从控制台应用程序执行此查询时,它会生成SQL并完美地执行 但是,当我从web应用程序执行它时,会收到一条错误消息,指出Linq To Entites无法识别Min()函数,并且无法将其转换为存储表达式 这是完全相同的查询。两个项目在其配置文件中具有相同的设置(关于EF 6),并且它们引用相同的程序集 from ce in db.CustomEvents where ce.fld_start > DateTime.Now group ce

我在下面有一个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 aggregate是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(这个IEnumerable)
的两个不同实现之间的不明确性(.net的实现和我们自己的实现)。从文件中删除“using OurLibrary;”名称空间修复了问题。

在vittore建议使用扩展方法语法后,我们发现问题在于,在web项目中,我们引用了一个库,其中包含
Min(this IEnumerable)
,我们还使用OurLibrary.Namespace编写了
指令

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() })
当我们使用linq语法时,编译器为查询选择了我们的Min实现,并且没有抛出任何错误。然后,在运行时,LINQtoEntities框架崩溃,因为它无法识别我们的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只是语法糖。

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