将两个嵌套的列表<对象>与 LINQ 联合起来

本文关键字:对象 LINQ 起来 列表 两个 嵌套 | 更新日期: 2023-09-27 18:30:20

我有一个AlbumArtist类(这是我的EF实体):

public class AlbumArtist : IEquatable<AlbumArtist>
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual List<Album> Albums { get; set; }
    public bool Equals(AlbumArtist albumArtist)
    {
        return Title.Equals(albumArtist.Title);
    }
    public override int GetHashCode()
    {
        return Title.GetHashCode();
    }
}

还有一个专辑类(也是我的 EF 实体):

public class Album : IEquatable<Album>
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual List<AlbumArtist> AlbumArtists { get; set; }
    public bool Equals(Album album)
    {
        return Title.Equals(album.Title);
    }
    public override int GetHashCode()
    {
        return Title.GetHashCode();
    }
}

所以,正如你所看到的,我有多对多的关系。

我创建一个列表,填充它,然后使用 DbContext 保存它,然后我创建并填充第二个列表。然后我尝试合并这两个列表(一个来自 DbContext,第二个来自局部变量)并将结果保存到 DbContext(插入新实体并更新现有实体)。

我的两个列表中有以下数据:

--Infected Mushroom
----Classical Mushroom
----Converting Vegetarians
...

--Infected Mushroom
----The Gathering ‎
----Converting Vegetarians
--Skazi
...

我尝试获取以下数据:

--Infected Mushroom
----Classical Mushroom
----The Gathering ‎
----Converting Vegetarians
--Skazi
...

请帮助我编写一些 LINQ 查询来实现我的目标。

谢谢!

将两个嵌套的列表<对象>与 LINQ 联合起来

LINQ 的帮助下SelectMany可以实现。

你可以在这里找到SelectMany的例子

您可以使用

LINQ 运算符 JoinUnion 。为了证明这一点,我将您的问题简化为两个字符串组列表:

var list1 = new[] {
    Tuple.Create("Infected Mushroom", "Classical Mushroom"),
    Tuple.Create("Infected Mushroom", "Converting Vegetarians"),
    Tuple.Create("Skazi", "Animal")
}
.GroupBy(t => t.Item1, t => t.Item2);
var list2 = new[] {
    Tuple.Create("Infected Mushroom", "The Gathering"),
    Tuple.Create("Skazi", "Animal")
}
.GroupBy(t => t.Item1, t => t.Item2);
每个

列表中的每个项目都是一个IGrouping其中Key是艺术家,IGrouping的元素是专辑。

然后,您可以使用Join合并这两个列表:

var combinedList = list1.Join(
  list2,
  g1 => g1.Key,
  g2 => g2.Key,
  (g1, g2) => new { Artist = g1.Key, Albums = g1.Union(g2) }
);

g1.Keyg2.Key匹配可确保元素与艺术家匹配。对于每个艺术家,专辑由g1.Union(g2)创建。