实体框架:LINQ查询在本地执行和服务器执行之间生成不同的SQL

时间:2013-07-15 14:38:54

标签: c# linq entity-framework

我有一个非常基本的Linq查询,如果我在Visual Studio或IIS服务器上本地执行它,则返回相同的结果 - 但始终以同一数据库服务器为目标。 我使用SQL Server Profiler跟踪执行的真实SQL查询,发现在本地或远程执行时它们不一样!

本地它使用左连接而远程使用内连接 - 因此在本地它返回记录但不远程。我认为好的行为将是第二次,因为我在TableA和TableB之间定义了一个不可为空的外键。以下是Linq请求:

from a in TableA.Include("TableB.TableC")
where a.Id == someId
select a;

实际上,第一个连接总是在内部连接中转换,但第二个连接是在本地执行时的左连接。

但我的首要任务是知道它为什么在本地和远程生成不同的查询。 框架版本是相同的,实体框架版本是相同的(本地复制)...有些东西必须不同但我找不到什么!你有什么线索吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

最后,问题是框架版本。我认为它是相同版本的.NET,但它不是:本地4.0.30319.1和远程4.0.30319.17929。似乎4.0.30319.17929是.NET Framework 4.5,因此它不仅仅是一个不同的版本。我已经卸载了4.5版本,并在服务器上重新安装了4.0这很奇怪,因为它在文件夹C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319中重新安装它,但文件版本现在正确,4.0.30319.1(文件版本是4.0.30319.17929之前)然后我已经在IIS应用程序池中更改了.NET版本。它在卸载后已重置为2.0版,因此我重置为版本4并重新启动池(但它仍在应用程序池中显示版本v4.0.30319 ...)。现在它的工作方式与本地一样,它只进行一次内连接,然后进行左连接。

我认为这是版本4.5中添加的错误修复,因为它应该使用内部联接,因为不可为空的外键(请注意,主键由多个列组成)但是这种更改很难检测到升级到4.5 ...