【问题标题】:EntityFramework Core select M:N related dataEntity Framework Core 选择 M:AND 相关数据
【发布时间】:2023-04-02 19:55:01
【问题描述】:

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

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

数据库表:

  1. 人员 {Id (in), Firstname (nvarchar), Lastname (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 表(组)字段的列表。 我正在寻找的结果是


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

顺便说一句:如果您将一些关于 EF(核心)和 linq 的优秀阅读链接发布到 cmets 中,我将非常高兴。看来我有很多初学者的问题。

【问题讨论】:

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


    【解决方案1】:

    您可能在 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);
    

    关于文档,可以开始here

    更新

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

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

    【讨论】:

    • 感谢您提供文档链接。这个我知道,但不幸的是它没有涵盖问题中的简单内容。在 101 之后开始使用的信息会更少。我猜 m:n 应该是 102。您的代码运行良好,非常感谢,但您介意添加第二个代码 sn-p 关于如何摆脱 "groupAssignment": [] 所以只需选择组的 id 和名称?跨度>
    • 嗨,@monty,看看我的更新,让我知道这是否是你要找的
    • 再次感谢您。这正是我想要的。节省了我的一天以下几个。
    • 抱歉,详细信息较晚,但是如果 Person(由于某种原因)两次在同一组中,我将在哪里为 ga.Group.Id 放置一个组以仅获得一个条目?跨度>
    • 想通了:-)
    猜你喜欢
    • 2021-12-03
    • 2019-02-23
    • 2017-08-01
    • 1970-01-01
    • 2020-06-16
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多