c# - Entity Framework : LINQ query generates different SQL between local execution and server execution

标签 c# linq entity-framework

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

在本地它使用 Left join 而在远程它使用 Inner join - 因此它在本地返回一条记录但在远程不返回。我认为好的行为是第二​​个,因为我在 TableA 和 TableB 之间定义了一个不可为 null 的外键。以下是 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(文件之前的版本是 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/

相关文章:

c# - Xamarin.Forms FontAwesome 不适用于绑定(bind)属性

c# - 如何在 Visual Studio 中打开表单设计器?

c# - 使用 C# 将数据表转换为分层数据结构 (JSON)

c# - 从 LINQ ExecuteMethodCall 中提取 SQL 'print' 消息

c# - 为所有用户部署 VSTO 加载项

c# - 通过反射从动态中检索属性信息

c# - 查找嵌套集合的最大深度/级别

c# - 无法跟踪实体类型 Model 的实例,因为已经在跟踪另一个具有相同键值 {'Id' } 的实例

c# - 使用存储库模式时 Entity Framework 不刷新数据

c# - 使用 MVC 时实体模型的命名约定