首页 > 解决方案 > 实体框架 6 - 左连接 - 防止在连接子句条件中添加空检查

问题描述

实体框架有没有办法尊重左连接中的“UseDatabaseNullSemantics”选项?

基本上,我想防止在生成的 SQL 查询中添加“OR (([ExtentX].[Property] IS NULL) AND ([ExtentY].[Property] Is Null))”。我看过以下讨论,但没有一个提供适用于我的查询的解决方案:

UseDatabaseNullSemantics 仍然生成 NULL 检查

为什么 EF 生成带有不必要的空检查的 SQL 查询?

防止 LINQ to Entity Joins 中的 NULL 检查

它必须是左连接...我不能将连接条件放在 where 子句中,因为它不会产生相同的结果,如果没有匹配项,我需要允许空数据(因此左连接)。

基本上,我有一个类似于以下的查询:

 (from c in dbContext.CPUs 
 join u in dbContext.UData on c.User equals u.User into ud 
 from uds in ud.DefaultIfEmpty()
 select new ResultOjbect{});

它会生成这个讨厌的 SQL:

SELECT BLAH FROM CpuTable LEFT OUTER JOIN UserTable (ON CPUTable.User = UserTable.User) 
OR ((CpuTable.User IS NULL) AND (UserTable.User IS NULL))

添加OR ((CpuTable.User IS NULL) AND (UserTable.User IS NULL))会导致糟糕的性能,并使 17000 条记录的查询需要 2 分钟。如果从生成的 SQL 中删除它,加载 17000+ 条记录需要 23 秒。

为什么没有选项来控制它?这是非常不必要的,并且会减慢我的查询速度。有人知道解决方法吗?

标签: sqlasp.net-mvcentity-frameworklinqentity-framework-6

解决方案


推荐阅读