如何在EF Core中查询拥有活跃所有者的Business(固定Schema)?
在Entity Framework Core中实现与目标SQL一致的业务查询
需求说明
需要查询所有满足以下条件的Business:该业务拥有IsActive = true的主所有者(关联PrimaryBusinessID)或次所有者(关联SecondaryBusinessID),且结果需与给定的SQL逻辑完全一致。
实现代码
方式一:严格模拟原SQL的子查询与左连接逻辑(EF Core 5+ 支持)
// 构建原SQL中的活跃所有者子查询 var activeOwnersSubquery = _context.Owners .Where(owner => owner.IsActive) .Select(owner => new { owner.PrimaryBusinessID, owner.SecondaryBusinessID }); // 执行左连接并去重,与原SQL逻辑完全匹配 var businesses = from business in _context.Businesses join owner in activeOwnersSubquery on business.ID equals owner.PrimaryBusinessID || business.ID equals owner.SecondaryBusinessID into joinedOwners from joinedOwner in joinedOwners.DefaultIfEmpty() select business; // 去重并选择需要的字段 var result = businesses.Distinct() .Select(b => new { b.ID, b.Name }) .ToList();
方式二:使用Union替代OR关联(兼容低版本EF Core)
如果你的EF Core版本不支持在join的on条件中使用OR,可以拆分两个独立关联查询后合并:
var activeOwners = _context.Owners .Where(o => o.IsActive) .Select(o => new { o.PrimaryBusinessID, o.SecondaryBusinessID }); // 匹配主所有者的业务 var primaryBusinesses = _context.Businesses .Join(activeOwners, b => b.ID, o => o.PrimaryBusinessID, (b, o) => b); // 匹配次所有者的业务 var secondaryBusinesses = _context.Businesses .Join(activeOwners, b => b.ID, o => o.SecondaryBusinessID, (b, o) => b); // 合并结果并去重 var result = primaryBusinesses .Union(secondaryBusinesses) .Distinct() .Select(b => new { b.ID, b.Name }) .ToList();
逻辑说明
- 两种方式都先筛选出活跃所有者数据,对应原SQL中的子查询部分。
- 方式一通过EF Core左连接语法(
into+DefaultIfEmpty())模拟原SQL的LEFT OUTER JOIN,关联条件直接对应原SQL的OR逻辑。 - 方式二将原SQL的OR关联拆分为两个独立JOIN,再通过
Union合并结果,最终用Distinct去重,保证和原SQL的SELECT DISTINCT结果一致。
内容的提问来源于stack exchange,提问作者CrystalBlue
相关产品推荐
相关产品推荐

