我有一个linq查询,在给定条件的情况下检查是否存在值。它在Permits
FK上加入AccessControlTypes
,EntanceEnhancementHistories
和Guid
。它检查类型许可证"完全"或"有限"查看他们是否有任何关联的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个查询,但我认为这不是必需的。
答案 0 :(得分:0)
您正在使用“内部联接”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();
答案 1 :(得分:0)
如果您希望看到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;