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

时间:2016-10-11 13:50:26

标签: c# linq asp.net-web-api entity-framework-core

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

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

数据库表:

  1. 人{Id(in),名字(nvarchar),姓氏(nvarchar)}
  2. 组{Id(int),Name(string)}
  3. GroupAssignment {Id(int),PersonId(int),GroupId(int)}
  4. 数据库数据: Id 1的人被分配到组1和组。

    我的查询按预期返回链接的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(核心)和linq的一些好的阅读链接,我会非常高兴。我似乎有很多初学者的问题。

1 个答案:

答案 0 :(得分:2)

您可能在Group实体中拥有GroupAssigment导航属性。如果是这种情况,请使用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);

关于文档,您可以启动here

更新

要实现您在下面评论的内容,您可以使用anonymous type仅投影这两个属性:

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