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

5
我有一个非常基本的Linq查询,如果我在Visual Studio本地执行或在IIS服务器上执行,它不会返回相同的结果 - 但始终针对同一数据库服务器。 我使用SQL Server Profiler跟踪实际执行的SQL查询,并发现在本地或远程执行时它们并不相同! 本地查询使用了Left join,而远程查询使用了Inner join - 因此本地返回记录,但远程不返回。我认为第二种行为是好的,因为我在TableA和TableB之间定义了非空外键。以下是Linq请求:
from a in TableA.Include("TableB.TableC")
where a.Id == someId
select a;

事实上,第一个连接始终被翻译为内部连接,但在本地执行时,第二个连接是左连接。

但我的优先级是了解为什么会在本地和远程生成不同的查询。框架版本相同,Entity Framework版本相同(在本地复制)...一定有所不同,但我找不到哪里不同!你有任何线索吗?

提前谢谢。


是的,同一个应用程序和同一个连接字符串。 - user1756338
生成 SQL 的是哪个程序集?是 EntityFramework.dll 吗? - user1756338
我刚刚发现框架的构建版本不同,本地是4.0.30319.1,远程是4.0.30319.17929。如果SQL不是由Entity Framework自动生成的话,这可能是问题所在...? - user1756338
你可以使用https://dev59.com/P3M_5IYBdhLWcg3wWRyV来获取查询而不必进行分析。 - Brad Christie
如果问题已经解决,您应该回答自己的问题并将其标记为已解决 :) - bflemi3
显示剩余6条评论
1个回答

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时很难检测到...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接