EntityFramework Core选择M:N个相关数据

本文关键字:数据 Core 选择 EntityFramework | 更新日期: 2023-09-27 18:12:38

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

我试图从前面的问题扩展我的例子,添加一个m:n关系。

数据库表:

  1. 人{Id (in),名(nvarchar),姓(nvarchar)}
  2. 组{Id (int), Name (string)}
  3. 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表(Groups)字段的列表。我要找的结果是


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

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

EntityFramework Core选择M:N个相关数据

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

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})