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
相关产品推荐
相关产品推荐

