我有一个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查询来实现我的目标。
谢谢!
答案 0 :(得分:2)
在SelectMany
函数的帮助下,LINQ可以实现。
你可以找到SelectMany
Here
答案 1 :(得分:0)
您可以使用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)
创建。