在2次连接和where或条件之后检查连接查询中的空值
本文关键字:连接 查询 检查 空值 之后 条件 2次 where | 更新日期: 2023-09-27 18:19:21
我有一个linq查询,它正在检查给定条件下是否存在一个值。它连接Permits
, AccessControlTypes
和EntanceEnhancementHistories
,都在它们的Guid
fk上。它检查类型为"Full"或"Limited"的许可,以查看它们是否有任何相关的EntranceEnhancementHistories
。
bool LimitedorFullEntranceEnhancementValue = (
from p in context.Permits
join a in context.AccessControlTypes on p.EntranceAccessControlTypeGUID equals a.GUID
join e in context.EntranceEnhancementHistories on p.GUID equals e.PermitGUID
where p.GUID.Equals(PermitGuid)
&& ((a.Description.Equals("Full") || a.Description.Equals("Limited"))
&& (e.GUID == null))
select e).Any();
return LimitedorFullEntranceEnhancementValue;
查询失败。如果它确实找到了完整或有限的描述,但没有找到entrancehancementvalue
(它应该是null
),则返回false。它工作正常,没有检查null
entranceenhancementvalue
,我能够得到它与2查询工作,但我不认为这应该是必要的。
您正在使用"内连接" on p.GUID equals e.PermitGUID
,这意味着您只会看到e.PermitGUID
存在的结果。我认为你需要更像这样的东西:
(from p in context.Permits
join a in context.AccessControlTypes on p.EntranceAccessControlTypeGUID equals a.GUID
where p.GUID.Equals(PermitGuid)
&& ((a.Description.Equals("Full") || a.Description.Equals("Limited"))
&& !context.EntranceEnhancementHistories.Any(e => p.GUID == e.PermitGUID)
select p).Any();
如果希望看到Guid键为空的行,则需要使用LEFT OUTER JOIN:
(from p in context.Permits
join a in context.AccessControlTypes on p.EntranceAccessControlTypeGUID equals a.GUID
join t in context.EntranceEnhancementHistories on p.GUID equals e.PermitGUID into leftJoin
join e in leftJoin on p.DefaultIfEmpty()
where p.GUID.Equals(PermitGuid)
&& ((a.Description.Equals("Full") || a.Description.Equals("Limited"))
&& (e.GUID == null))
select e).Any();
返回LimitedorFullEntranceEnhancementValue;