我有一个非常基本的Linq查询,如果我在Visual Studio或IIS服务器上本地执行该查询,则不会返回相同的结果-但始终以同一数据库服务器为目标。
我使用SQL Server Profiler来跟踪执行的实际SQL查询,发现在本地或远程执行时,它是不一样的!
在本地,它使用左联接,而在远程,则使用内部联接-因此在本地,它返回记录,但不是远程。我认为良好的行为将是第二,因为我在TableA和TableB之间定义了一个不可为空的外键。以下是Linq请求:
from a in TableA.Include("TableB.TableC")
where a.Id == someId
select a;
实际上,第一个联接总是转换为内部联接,而第二个联接是在本地执行时的左联接。
但我的首要任务是要知道为什么它会在本地和远程生成不同的查询。
框架版本相同, Entity Framework 版本相同(本地复制)...某些内容必须不同,但我找不到什么!你有什么线索吗?
先感谢您。
最佳答案
所以最后,问题出在框架版本上。我以为它是.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(file版本是4.0.30319.17929之前的版本),然后在IIS应用程序池中更改了.NET版本。卸载后已将其重置为版本2.0,因此我重置为版本4并重新启动池(但它仍在应用程序池中显示版本v4.0.30319 ...)。现在它像本地一样工作,先执行一个内部联接,然后执行一个左联接。
我认为这是版本4.5中添加的错误修复,因为它应使用内部联接,因为外键不可为空(请注意,主键由几列组成),但是在升级到4.5 ...
关于c# - Entity Framework : LINQ query generates different SQL between local execution and server execution,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17656897/