C# EntityFramework核心选择M:N相关数据

C# EntityFramework核心选择M:N相关数据,c#,linq,asp.net-web-api,entity-framework-core,C#,Linq,Asp.net Web Api,Entity Framework Core,我似乎对EF Core/Linq/Navigation属性的工作方式有很大的误解 我试图从添加m:n关系扩展我的示例 数据库表: 人{Id(in)、名(nvarchar)、姓(nvarchar)} 组{Id(int),名称(字符串)} GroupAssignment{Id(int)、PersonId(int)、GroupId(int)} 数据库数据: Id为1的人员被分配到组1和组3 我的查询按预期返回链接的GroupAssignments: var result = from person

我似乎对EF Core/Linq/Navigation属性的工作方式有很大的误解

我试图从添加m:n关系扩展我的示例

数据库表:

  • 人{Id(in)、名(nvarchar)、姓(nvarchar)}
  • 组{Id(int),名称(字符串)}
  • GroupAssignment{Id(int)、PersonId(int)、GroupId(int)}
  • 数据库数据: Id为1的人员被分配到组1和组3

    我的查询按预期返回链接的GroupAssignments:

    
    var result = from person in _dbContext.Person
                select new
                {
                    id = person.Id,
                    firstname = person.Firstname,
                    lastname = person.Lastname,
                    groupAssignments = person.GroupAssignment  
                };
    
    return Ok(result);
    
    但是我想得到一个包含N个表(组)字段的列表。 我想要的结果是

    
    [
    {
        "id": 1,
        "firstname": "First1",
        "lastname": "Last1",
        "groupAssignments": 
        [
             {
             "id": 1,
             "name": "test group 1"
             },
             {
             "id": 3,
             "name": "test group 3"
            }
        ]
    }
    ]
    


    顺便说一句:如果你在评论中发布一些关于EF(核心)和linq的好阅读链接,我会非常高兴。看来我有很多初学者的问题。

    您可能在
    GroupAssigment
    实体中有一个
    Group
    导航属性。如果是这种情况,请使用
    选择
    扩展方法:

    var result = from person in _dbContext.Person
                select new
                {
                    id = person.Id,
                    firstname = person.Firstname,
                    lastname = person.Lastname,
                    groupAssignments= person.GroupAssignment.Select(ga=>ga.Group)  
                };
    
    return Ok(result);
    
    关于文档,您可以开始

    更新 要实现您在下面的评论,您可以使用项目仅对这两个属性进行投影:

    groupAssignments= person.GroupAssignment.Select(ga=>new{id=ga.Group.Id,name=ga.Group.Name}) 
    

    感谢您提供文档的链接。这个我知道,但不幸的是,它没有涵盖问题中的简单内容。从101岁以后开始学习,信息就少了。m:我想n应该是102。您的代码运行得很好,非常感谢,但您是否介意添加第二个关于如何摆脱
    “groupAssignment”的代码片段:[]
    ,所以只需选择组的id和名称?您好,@monty,请查看我的更新,并让我知道您是否希望再次感谢您。这正是我想要的。为我的一天节省了以下几项。对于延迟的详细信息,很抱歉,但是如果该人(出于某种原因)在同一个组中两次,我将在何处放置group by,以便ga.group.Id仅获取一个条目?计算出:-)