将两个嵌套的列表<对象>与 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 的帮助下SelectMany
可以实现。
你可以在这里找到SelectMany
的例子
您可以使用
LINQ 运算符 Join
和 Union
。为了证明这一点,我将您的问题简化为两个字符串组列表:
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.Key
与g2.Key
匹配可确保元素与艺术家匹配。对于每个艺术家,专辑由g1.Union(g2)
创建。