如何筛选与活跃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
相关产品推荐
相关产品推荐

