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

LINQ查询中CustomerResponse随地址重复,需实现单实例含多地址

解决LINQ查询中重复生成CustomerResponse的问题

你的问题核心是错误展开了分组后的地址集合:原查询里的from adresses in adr.DefaultIfEmpty()会把每个客户的地址逐条拆出,导致每一条地址对应生成一个CustomerResponse实例。要实现单个CustomerResponse包含多个地址子对象,直接利用分组后的地址集合构建列表即可,无需展开分组。

修正后的LINQ查询

var query = from customer in _unitOfWork.customerRepository.All()
            join address in _unitOfWork.AdresRepository.All() 
                on customer.adressNo equals address.adressNo into addressGroup
            select new CustomerResponse
            {
                CustomerName = customer.Name,
                Addresses = addressGroup.DefaultIfEmpty()
                    .Select(adr => new Address
                    {
                        adressName = adr?.name, // 用空合并运算符处理无地址的空值情况
                        adressNo = adr?.Number
                    })
                    .ToList() // 若CustomerResponse的Addresses是List类型则保留,否则可省略
            };

关键调整说明

  • 移除from adresses in adr.DefaultIfEmpty():这行是导致重复的根源,它将分组后的地址集合拆分为单个元素输出,每一条地址都会生成一个CustomerResponse。
  • 直接使用分组集合addressGroup:通过Select遍历分组内的所有地址对象,批量转换为Address类型并赋值给CustomerResponse的地址列表属性。
  • 空值处理:因为用了DefaultIfEmpty(),当客户无对应地址时adr会为null,adr?.name这种语法可以避免空引用异常。

配套实体类示例(需匹配属性定义)

确保你的CustomerResponse类包含存储多地址的属性:

public class CustomerResponse
{
    public string CustomerName { get; set; }
    public List<Address> Addresses { get; set; } // 或IEnumerable<Address>类型
}

public class Address
{
    public string adressName { get; set; }
    public int? adressNo { get; set; } // 可空类型适配无地址的场景
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:31:03