代码之家  ›  专栏  ›  技术社区  ›  kudlatiger

如何在实体框架中通过适当的JSON响应实现多个表的左联接

  •  0
  • kudlatiger  · 技术社区  · 6 年前

    我正在尝试使用Entity Framework Linq语句加入3个表。

    这是我的数据库图表:

    enter image description here

    数据在 DeviceTypeGroups 表:

      Key         | Name
      ------------+------------------- 
      111             GroupOne
      112             GroupTwo
    

    数据在 DeviceTypes 表:

      Key         | Name         | DeviceTypeGroupKey
      ------------+--------------+--------------------
      1             Type1          111
      2             Type2          111
      3             Type3          112
    

    数据在 Peers 表:

      Key         | Name         | DeviceTypeGroupKey
      ------------+--------------+---------------------
      1             Peer1          111
      2             Peer2          112
      3             Peer3          112
    

    我想得到这样的输出:

    enter image description here

    这是我正在尝试的LINQ代码和C Web API方法

        [HttpGet]
        [Route("devicetypegroups")]
        [Produces("application/json")]
        [SwaggerOperation("GetDeviceTypeGroups")]
        [SwaggerResponse(400, "Bad input parameter")]
        [SwaggerResponse(404, "Not found")]
        [SwaggerResponse(500, "Internal server error")]
        public virtual IActionResult GetDeviceTypeGroups()
        {
            try
            {
                var devicetypegroups = 
                    (from dtg in _context.DeviceTypeGroups join dt in _context.DeviceTypes 
                     on dtg.Key equals dt.DeviceTypeGroup.Key into dtgleft from dtgrecs in dtgleft.DefaultIfEmpty()
                     join pr in _context.Peers on dtgrecs.Key equals pr.DeviceTypeGroup.Key into peerleft
                     from peerleftRecs in peerleft.DefaultIfEmpty()
                     select new { dtg.Key, dtg.Name, dtg.DeviceTypes, dtg.Peers }).ToList();
               }
           }
    

    但是它没有返回正确的响应,它添加了一些额外的记录:

    enter image description here

    如您所见,它创建了与设备类型计数相同的额外节点数!

    2 回复  |  直到 6 年前
        1
  •  1
  •   shbht_twr    6 年前

    您需要如下内容:

        var details = (from dtg in _context.DeviceTypeGroups
                          join dt in _context.DeviceTypes on dtg.Key equals dt.DeviceTypeGroup.Key into dtgleft
                     from dtgrecs in dtgleft.DefaultIfEmpty()
                          join pr in _context.Peers on dtgrecs.Key equals pr.DeviceTypeGroup.Key into peerleft 
                     from peerleftRecs in peerleft.DefaultIfEmpty()
                          select new
                          {
                              dtg.Key,
                              dtg.Name,
                              dtg.DeviceTypes,
                              dtg.Peers
                           }).ToList();
    
        2
  •  0
  •   kudlatiger    6 年前

    这就是我通过使用 AutoMapper

            var devicetypegroups = await _context.DeviceTypeGroups
                    .Include(b => b.DeviceTypes)
                    .Include(p => p.Peers)
                    .ToListAsync();
    
    
            var model = _mapper.Map<IEnumerable<DeviceTypeGroupDto>>(devicetypegroups);
    

    :)