【问题标题】:Entity Framework Core + API .NET Core + n to n relationshipEntity Framework Core + API .NET Core + n 对 n 关系
【发布时间】:2021-03-16 05:02:32
【问题描述】:

我正在发现带有 Entity Framework 的 .NET Core。

有我的数据结构:

public class User
{
    public int Id { get; set; }
    public List<Data1> Datas1 { get; set; }
}

public class Data1
{
    public int Id { get; set; }
    public User User { get; set; }
    public List<Data1_Data2> Datas2 { get; set; }
}

public class Data2
{
    public int Id { get; set; }
    public List<Data1_Data2> Datas1 { get; set; }
}

public class Data1_Data2
{
    public int Data1Id { get; set; }
    public Data1 Data1 { get; set; }
    public int Data2Id { get; set; }
    public Data2 Data2 { get; set; }
}

我的目标是检索用户拥有的所有 Data2 对象。

其实我是在尝试用EF做这个请求:

SELECT d.* FROM User a
INNER JOIN
Data1 b
ON a.Id = b.UserId
INNER JOIN
Data1_Data2 c
ON
c.Data1Id = b.Id
INNER JOIN
Data2 d
ON
d.Id = c.Data2Id
WHERE a.Id = <myId>

目前,我正在像这样使用 EF:

User dbUser = await _context.Users.Include(u => u.Datas1).ThenInclude(b => b.Datas2).ThenInclude(lb => lb.Data1).FirstAsync(u => u.Id == <myId>);

List<Data2> datas2List = new List<Data2>();

foreach (Data1 b in dbUser.Data1s)
{
    foreach (Data1_Data2 lb in b.Datas2)
    {
        Datas2List.Add(lb.Data2);
    }
}

我可以只获取 Data2 的列表而不下载所有数据吗?例如,如果 User 相对于 1M+ Data1 对象,我的内存就会爆炸。而且我不想出于结构目的将 User 放入 Data2 中。我正在寻找这样的东西:

List<Data2> datas2List = await _context.<myStuff>

【问题讨论】:

    标签: sql-server entity-framework-core asp.net-core-webapi


    【解决方案1】:

    如果我没听错,您可以将.SelectMany(u =&gt; u.Datas1.Select(x =&gt; x.Datas2)) 放入您的 lambda 表达式中。

    所以完整的命令将被设置为将数据保存到User dbUser,现在你期待List&lt;Data2&gt; datas2List

    List<Data2> datas2List = await _context.Users
                                           .Include(u => u.Datas1)
                                           .ThenInclude(b => b.Datas2)
                                           .ThenInclude(lb => lb.Data1)
                                           .Where(u => u.Id == <myId>)
                                           .SelectMany(u => u.Datas1.Select(x => x.Datas2))
                                           .Tolist();
    

    此命令将在SELECT 中生成,仅用于检索Datas2 的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 2012-04-24
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多