- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 .DefaultIfEmpty() 语法使用具有大量左连接的 Oracle EF 框架(Oracle.ManagedDataAccess.EntityFramework nuget 包,版本 12.1.2400)创建一个相当复杂的查询:
from i in dbHR.Identities
join p in dbHR.Personals
on new {
key1 = i.ID,
key2 = true,
key3 = true
} equals new {
key1 = p.EID_ID,
key2 = (DbFunctions.TruncateTime(p.EFFECTIVE).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) <= 0),
key3 = (DbFunctions.TruncateTime(p.EXPIRY).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0)
}
into pj from p in pj.DefaultIfEmpty()
join s in dbHR.States on p.DSP_ID_ADDRESS equals s.ID into sj from s in sj.DefaultIfEmpty()
join e in dbHR.Employments
on new {
key1 = i.ID,
key2 = true
}
equals new {
key1 = e.EID_ID,
key2 = (!e.TERMINATION_DATE.HasValue || DbFunctions.TruncateTime(e.TERMINATION_DATE.Value).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0)
}
into ej from e in ej.DefaultIfEmpty()
join a in dbHR.Assignments
on new {
key1 = e.ID,
key2 = true
} equals new {
key1 = a.EEM_ID,
key2 = ((!a.ASSIGNMENT_END_DATE.HasValue || DbFunctions.TruncateTime(a.ASSIGNMENT_END_DATE.Value).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0)
&& (DbFunctions.TruncateTime(a.ASSIGNMENT_START_DATE).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) <= 0)
&& (a.PRIME_ASSIGNMENT != null))
}
into aj from a in aj.DefaultIfEmpty()
join ad in dbHR.AssignmentDetails
on
new { key1 = a.ID, key2 = true }
equals
new
{
key1 = ad.EAS_ID,
key2 = (
DbFunctions.TruncateTime(ad.EXPIRY).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0
&& DbFunctions.TruncateTime(ad.EFFECTIVE).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) <= 0
)
}
into adj from ad in adj.DefaultIfEmpty()
join j in dbHR.Jobs
on ad.DJB_ID equals j.ID
into jj from j in jj.DefaultIfEmpty()
join jd in dbHR.JobDetails
on new {
key1 = j.ID, key2 = true
} equals new {
key1 = jd.DJB_ID,
key2 =
(
DbFunctions.TruncateTime(jd.EFFECTIVE).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) <= 0
&& DbFunctions.TruncateTime(jd.EXPIRY).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0
)
}
into jdj from jd in jdj.DefaultIfEmpty()
join d in dbHR.Departments
on ad.DDP_ID equals d.ID
into dj from d in dj.DefaultIfEmpty()
join dd in dbHR.DepartmentDetails
on new {
key1 = d.ID, key2 = true
} equals new {
key1 = dd.DDP_ID,
key2 =
(
DbFunctions.TruncateTime(dd.EFFECTIVE).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) <= 0
&& DbFunctions.TruncateTime(dd.EXPIRY).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0
)
} into ddj from dd in ddj.DefaultIfEmpty()
select new HREmployeeRecord
{
i=i,
p= p,
s=s,
e=e,
a=a,
ad=ad,
j=j,
jd=jd,
d=d,
dd=dd
}
EF 生成的结果 SQL 在大多数表上留下了连接,但其中 3 个继续恢复为内部连接:
FROM "DB"."DB_HR_IDENTITIES" "Extent1"
LEFT OUTER JOIN "DB"."DB_HR_PERSONALS" "Extent2" ON ("Extent1"."ID" = "Extent2"."EID_ID") AND [...datetime comparison removed for brevity...]
LEFT OUTER JOIN "DB"."DB_CM_STATE_PROVINCES" "Extent3" ON "Extent2"."DSP_ID_ADDRESS" = "Extent3"."ID"
LEFT OUTER JOIN "DB"."DB_HR_EMPLOYMENTS" "Extent4" ON ("Extent1"."ID" = "Extent4"."EID_ID") AND [...datetime comparison removed for brevity...]
LEFT OUTER JOIN "DB"."DB_HR_ASSIGNMENTS" "Extent5" ON ("Extent4"."ID" = "Extent5"."EEM_ID") AND [...datetime comparison removed for brevity...]
INNER JOIN "DB"."DB_HR_ASSIGNMENT_DETAILS" "Extent6" ON ("Extent5"."ID" = "Extent6"."EAS_ID") AND ((TRUNC("Extent6"."EXPIRY")) >= (TRUNC(LOCALTIMESTAMP))) AND ((TRUNC("Extent6"."EFFECTIVE")) <= (TRUNC(LOCALTIMESTAMP)))
INNER JOIN "DB"."DB_CM_JOBS" "Extent7" ON "Extent6"."DJB_ID" = "Extent7"."ID"
LEFT OUTER JOIN "DB"."DB_CM_JOB_DETAILS" "Extent8" ON ("Extent7"."ID" = "Extent8"."DJB_ID") AND [...datetime comparison removed for brevity...]
INNER JOIN "DB"."DB_CM_DEPARTMENTS" "Extent9" ON "Extent6"."DDP_ID" = "Extent9"."ID"
LEFT OUTER JOIN "DB"."DB_CM_DEPARTMENT_DETAILS" "Extent10" ON ("Extent9"."ID" = "Extent10"."DDP_ID") AND [...datetime comparison removed for brevity...]
我已经尝试用以下内容替换一些连接,但不幸的是它会导致相同的输出:
from ad in dbHR.AssignmentDetails.Where(x=>
a.ID == x.EAS_ID &&
(
DbFunctions.TruncateTime(x.EXPIRY).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) >= 0
&& DbFunctions.TruncateTime(x.EFFECTIVE).Value.CompareTo(DbFunctions.TruncateTime(DateTime.Now).Value) <= 0
)
).DefaultIfEmpty()
我开始拔头发了。
EF seems to use INNER JOIN for including a required and LEFT OUTER JOIN for including an optional navigation property.
虽然这是有道理的,但我认为它不适用于我的 AssignmentDetails 表,因为它是一个(分配)对多(AssignmentDetails)关系的多(FK)端,其中可能没有 AssignmentDetails 记录.
然而,对于 Departments 和 Jobs 表来说可能是正确的,因为它们是由外键引用的主键表 - 应该始终有一条记录。但是,这仍然会破坏结果,因为如果在连接中 FK 位于由于左连接而为 NULL 的表上,则由于 INNER 连接,整行将被删除。
如有任何帮助,我们将不胜感激!
最佳答案
我的错误。我将此查询包装在一个名为 GetEmployees() 的函数中,该函数返回一个 iQueryable 列表,并对其进行过滤:
results = HRFunctions.GetEmployees().Where(x => x.ad != null);
因为添加了一个假设 AD 不应该为 null 的 WHERE 子句,EntityFramework 智能地将 LEFT JOIN 更改为 INNER JOIN。
删除 .Where() 后,AssignmentDetails 现在是 Left Join。
关于c# - Entity Framework 在左连接时强制内部连接使用 DefaultIfEmpty() 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34300620/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!