在2次连接和where或条件之后检查连接查询中的空值

本文关键字:连接 查询 检查 空值 之后 条件 2次 where | 更新日期: 2023-09-27 18:19:21

我有一个linq查询,它正在检查给定条件下是否存在一个值。它连接Permits, AccessControlTypesEntanceEnhancementHistories,都在它们的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查询工作,但我不认为这应该是必要的。

在2次连接和where或条件之后检查连接查询中的空值

您正在使用"内连接" 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;