C# 如何在LINQ表达式中实现关联对象集合的匹配项筛选
解决方案
这个筛选逻辑完全可以在LINQ表达式中实现,你原有写法的问题通常来自两种场景:要么是操作的是EF/EF Core等ORM的数据库查询(LINQ to Entities),ORM无法直接将对应Contains逻辑翻译为SQL;要么是y.RelacaoProdutos存储的元素类型和x.CodigoProduto的类型不匹配。
分场景实现代码
场景1:操作内存中已加载的集合(LINQ to Objects)
只要保证类型匹配,直接用Any写法兼容性比Contains更高,执行逻辑完全符合你的需求:
list = (from x in relacaoProdutosFilial // 单字段关联不需要额外声明匿名类,简化写法即可 join y in _listaDeVendas on x.CodigoEmpresa equals y.CodigoEmpresa where y.RelacaoProdutos.Any(p => p == x.CodigoProduto) select new DetalhamentoVendaRealizada { // 你的属性赋值逻辑 }).ToList();
场景2:操作EF/EF Core的数据库查询(LINQ to Entities)
如果是查询数据库的IQueryable对象,需要保证写法可以被ORM翻译为SQL,调整为如下写法即可:
list = (from x in relacaoProdutosFilial join y in _listaDeVendas on x.CodigoEmpresa equals y.CodigoEmpresa // 先提取RelacaoProdutos里的产品编码字段再做Contains判断,可被ORM正常翻译 where y.RelacaoProdutos.Select(p => p.CodigoProduto).Contains(x.CodigoProduto) select new DetalhamentoVendaRealizada { // 你的属性赋值逻辑 }).ToList();
若
RelacaoProdutos是存储简单类型的JSON字段,EF Core 7+可以直接用EF.Functions.JsonContains(y.RelacaoProdutos, x.CodigoProduto.ToString())实现筛选。
内容的提问来源于stack exchange,提问作者Favieri
相关产品推荐
相关产品推荐

