如何使用正确的 json 响应在实体框架中实现多个表左连接

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

这是我的数据库图:

http://img1.mukewang.com/62ca8cef0001123606560437.jpg

表中数据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

我想得到这样的输出:

http://img2.mukewang.com/62ca8cfb0001eb9e04230887.jpg

这是我正在尝试的 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();

           }

       }

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

http://img4.mukewang.com/62ca8d0b0001929d02870682.jpg

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



PIPIONE
浏览 104回答 2
2回答

慕尼黑5688855

你想要下面的东西:    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();

ITMISS

这就是我通过使用解决它的方式AutoMapper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;devicetypegroups&nbsp;=&nbsp;await&nbsp;_context.DeviceTypeGroups &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Include(b&nbsp;=>&nbsp;b.DeviceTypes) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Include(p&nbsp;=>&nbsp;p.Peers) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToListAsync(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;model&nbsp;=&nbsp;_mapper.Map<IEnumerable<DeviceTypeGroupDto>>(devicetypegroups);:)
打开App,查看更多内容
随时随地看视频慕课网APP