ASP.NET Core LINQ如何查询未关联Project的Client数据?
获取未关联Project的Client数据
你要找的是没有任何Project关联的Client,用非等值join确实不是最优方案,下面给你几种靠谱的实现方式:
方法一:使用!Any()过滤(最直观)
利用Any()检查Client是否存在关联的Project,取反即可:
var unassociatedClients = _context.Clients .Where(c => !_context.Projects.Any(p => p.ClientId == c.Id)) .ToList();
方法二:左外连接+筛选空值
通过左连接Projects,然后筛选没有匹配到Project的Client:
var unassociatedClients = from c in _context.Clients join p in _context.Projects on c.Id equals p.ClientId into projectGroup from pg in projectGroup.DefaultIfEmpty() where pg == null select c;
方法三:使用Except()(适合已获取关联Client集合的场景)
先拿到所有已关联的Client Id,再用Except()取差集:
var associatedClientIds = _context.Projects.Select(p => p.ClientId).Distinct(); var unassociatedClients = _context.Clients .Where(c => !associatedClientIds.Contains(c.Id)) .ToList();
注意点
- 第一种方法EF通常会翻译成高效的
NOT EXISTSSQL,性能较好; - 如果
ClientId可能为null,要在Any()里加上p.ClientId != null的判断,避免逻辑错误。
内容的提问来源于stack exchange,提问作者Zaid mone
相关产品推荐
相关产品推荐

