如何用C# LINQ多表关联获取带宠物及玩具的Owner对象
解决LINQ层级数据查询问题:一次性获取带宠物及玩具的Owner对象
原代码存在的问题
- 直接将全局
pets集合赋值给Pets属性,未筛选当前Owner对应的宠物 - 使用普通Join会产生笛卡尔积,无法将每个Pet对应的Toys分组关联
- 未正确构建层级关系,导致Pet的Toys属性未填充
正确的LINQ查询实现
var singleOwnerQuery = from o in owners where o.Name == "..." && o.LastName == "..." join p in pets on o.FirstName equals p.OwnerName into ownerPets select new Owner { // 填充Owner自身属性 Name = o.Name, LastName = o.LastName, Pets = (from pet in ownerPets join t in toys on pet.PetId equals t.ToyUniqueId into petToys select new Pet { // 填充Pet自身属性 PetId = pet.PetId, OwnerName = pet.OwnerName, Toys = petToys.ToList() }).ToList() }; // 获取符合条件的单个Owner对象 var targetOwner = singleOwnerQuery.SingleOrDefault();
关键逻辑说明
- 外层Group Join:通过
into ownerPets将当前Owner对应的所有Pet分组,避免普通Join产生的笛卡尔积问题 - 内层Group Join:针对每个Pet,用
into petToys关联其对应的所有Toy,直接填充到Pet的Toys集合中 - 层级构建:从Owner到Pet再到Toy,逐层构建完整的层级对象,确保每个层级的数据都是当前实体的关联子集
- 单对象获取:用
SingleOrDefault()从查询结果中取出符合条件的单个Owner,避免返回集合
内容的提问来源于stack exchange,提问作者Kamil Turowski
相关产品推荐
相关产品推荐

