在2个连接之后检查连接查询中的空值以及where或condition

时间:2015-10-26 15:10:45

标签: c# linq

我有一个linq查询,在给定条件的情况下检查是否存在值。它在Permits FK上加入AccessControlTypesEntanceEnhancementHistoriesGuid。它检查类型许可证"完全"或"有限"查看他们是否有任何关联的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 个答案:

答案 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;