【问题标题】:how to query many to many relationship in Linq to EF5如何在 Linq to EF5 中查询多对多关系
【发布时间】:2013-06-27 04:36:03
【问题描述】:

我正在学习 EF5 并建立一个仅显示一些歌曲和歌手的小型网站。由于一首歌可以由多个歌手演唱,并且一个歌手会有很多歌曲,所以我的 EF 模型如下。

我想在一个表格中显示所有歌曲列表及其相关歌手,所以我写了一个查询,到目前为止我已经有了。

Dim res = context.Songs _
        .SelectMany(Function(song) song.Artists, Function(s, a) New With
                                                                {.SongTitle = s.SongTitle, _
                                                                .ArtistName = a.ArtistName, _
                                                                 .Lyrics = s.Lyrics})

但我得到的结果如下。

您会看到幸运在表格中显示了两次。我不希望这种情况发生。我只想显示一次,但在艺术家列中加入了两位歌手。我尝试阅读教程和许多论坛帖子,但这些教程并没有变得如此复杂。

那么我怎样才能更改查询以返回类似的内容?

【问题讨论】:

    标签: asp.net vb.net entity-framework many-to-many entity-framework-5


    【解决方案1】:

    我必须用 C# 写我的答案,希望你能把它翻译成 VB。

    我会做两处改变:

    • 首先,在这种情况下,只需使用Select 而不是SelectMany
    • 其次,引入一个命名的 ViewModel 而不是匿名类型,因为它允许您添加一个方法或自定义只读属性,这将在以后有所帮助。

    ViewModel 看起来像这样:

    public class SongViewModel
    {
        public string SongTitle { get; set; }
        public string Lyrics { get; set; }
        public IEnumerable<string> ArtistNames { get; set; }
    
        public string ArtistNamesString
        {
            get { return string.Join(", ", ArtistNames); }
        }
    }
    

    那么你可以使用这个查询:

    var res = context.Songs.Select(s => new SongViewModel
    {
        SongTitle = s.SongTitle,
        Lyrics = s.Lyrics,
        ArtistNames = s.Artists.Select(a => a.ArtistName)
    });
    

    现在,要列出结果,您可以使用这样的循环(带有控制台输出的示例):

    foreach (var item in res)
    {
         Console.WriteLine(string.Format("{0} {1} {2}",
             item.SongTitle, item.Lyrics, item.ArtistNamesString);
    }
    

    这仅列出每首歌曲一次,并且艺术家姓名显示为逗号分隔列表。

    【讨论】:

    • 非常感谢..这是非常有用的解释:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多