使用LINQ </object>联合两个嵌套的List <object>

时间:2013-09-05 11:26:12

标签: c# linq entity-framework

我有一个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查询来实现我的目标。

谢谢!

2 个答案:

答案 0 :(得分:2)

SelectMany函数的帮助下,LINQ可以实现。

你可以找到SelectMany Here

的例子

答案 1 :(得分:0)

您可以使用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)创建。