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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:48:02