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

如何筛选与活跃IAggregateRoot类A关联的ValueObject类B的ID?

筛选活跃A实例关联的B对象/ID解决方案

场景1:内存集合处理

假设你已经持有所有A实例的集合IEnumerable<A> allAs,可以通过LINQ链式查询完成筛选:

获取符合条件的B对象

var matchingBs = allAs
    .Where(a => a.IsActive) // 过滤出活跃的A实例
    .SelectMany(a => a.Bs ?? Enumerable.Empty<B>()) // 扁平化所有活跃A关联的B(处理Bs为null的情况)
    .Where(b => bIds.Contains(b.Id)) // 保留ID在目标数组中的B
    .ToList();

仅获取B的ID

var matchingBIds = allAs
    .Where(a => a.IsActive)
    .SelectMany(a => a.Bs?.Select(b => b.Id) ?? Enumerable.Empty<int>())
    .Intersect(bIds) // 取与目标ID数组的交集,自动去重
    .ToList();

场景2:ORM数据库查询(以EF Core为例)

如果数据存储在数据库中,利用EF Core的查询翻译能力,从A表出发关联查询:

获取符合条件的B对象

var matchingBs = await dbContext.As
    .Where(a => a.IsActive)
    .SelectMany(a => a.Bs)
    .Where(b => bIds.Contains(b.Id))
    .ToListAsync();

仅获取B的ID

var matchingBIds = await dbContext.As
    .Where(a => a.IsActive)
    .SelectMany(a => a.Bs.Select(b => b.Id))
    .Intersect(bIds)
    .ToListAsync();

注意事项

  • 如果Bs可能为null,务必添加空值判断(如?? Enumerable.Empty<B>()),避免空引用异常
  • 内存场景下,Intersect比Contains效率更高,尤其当数据量较大时,它会自动去重优化
  • ORM场景需确保导航属性Bs已正确配置,EF Core能生成正确的关联查询语句

内容的提问来源于stack exchange,提问作者Yoda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:29