简体   繁体   English

在2个联接以及where或条件之后检查联接查询中的空值

[英]Checking a null value in a join query after 2 joins and a where or condition

I have a linq query that is checking to see if a value exists, given criteria. 我有一个linq查询,它在给定条件下检查是否存在值。 It joins Permits , AccessControlTypes , and EntanceEnhancementHistories , all on their Guid FKs. 它加入PermitsAccessControlTypesEntanceEnhancementHistories他们,所有Guid FKS。 It checks Permits of Type "Full" or "Limited" to see if they have any associated EntranceEnhancementHistories . 它检查“ 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;

This query is failing. 该查询失败。 It's returning false in the case that is does find description of full or limited, but does not find an entrancehancementvalue (it should be null ). 如果确实找到了完整或有限的描述,但没有找到entrancehancementvalue (应该为null ),则返回false。 It works properly without the check for a null entranceenhancementvalue , and I'm able to get it working with 2 queries, but I don't think this should be necessary. 它可以正常工作,而无需检查是否为null entranceenhancementvalue ,并且我可以使它与2个查询一起使用,但是我认为这不是必需的。

You're using an "inner join" on p.GUID equals e.PermitGUID , which means you'll only see results where an e.PermitGUID exists. on p.GUID equals e.PermitGUID使用的“内部on p.GUID equals e.PermitGUID ,这意味着您只会在存在e.PermitGUID地方看到结果。 I think you want something more like this: 我想您想要更多类似这样的东西:

 (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();

You need to use a LEFT OUTER JOIN if you expect to see rows where the Guid key is null: 如果希望看到Guid键为null的行,则需要使用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();

return LimitedorFullEntranceEnhancementValue; 返回LimitedorFullEntranceEnhancementValue;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM