You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:06:19