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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:05:27