使用LinqToXml仅读取内部列表

3
使用LinqToXml,我想从像下面这样的xml文件中读取给定艺术家的专辑列表: ... ... 我尝试了以下LinqToXml代码。但是,我想避免实例化一个艺术家对象...
XDocument xartists = XDocument.Load(FilePhysicalPath); var artists = from xartist in xartists.Descendants("artist") where xartist.Attribute("name").Value.Equals(id) select new MusicArtist { Albums = from xalbum in xartist.Descendants("album") select new MusicAlbum { Title = xalbum.Attribute("title").Value, Year = int.Parse(xalbum.Attribute("year").Value) } }; var artist = artists.SingleOrDefault(); if (artist != null) return artist.Albums; else return null;
更新:我的当前“最佳”尝试: 请参阅已接受的答案。
2个回答

2
尝试像这样做:

尝试像这样做:

    return (from artist in 
                     (from xartist in xartists.Descendants("artist")
                     where xartist.Attribute("name").Value.Equals("Beatles")
                     select new MusicArtist
                     {
                         Albums = from xalbum in xartist.Descendants("album")
                                  select new MusicAlbum
                                  {
                                      Title = xalbum.Attribute("title").Value,
                                      Year =  int.Parse(xalbum.Attribute("year").Value)
                                  }
                     })
                  where artist != null
                 select artist).FirstOrDefault();

谢谢。原来的答案帮助我使用匿名类型简化了表达式。但是当前的答案并未给我新的内容。而且我不确定“太多”在内存中是否被实例化。(虽然在实际应用中没什么大不了的,但我想学习如何最小化内存使用。) - Ole Lynge

1

应该是这样的:

var result = from artist in xartists.Root.Elements("artist")
             where artist.Attribute("name").Value.Equals(id)
             let albums = artist.Element("albums")
             from album in albums.Elements("album")
             select new MusicAlbum
             {
                 Title = album.Attribute("title").Value,
                 Year = (int) album.Attribute("year")
             };

请特别注意使用Element/Elements而不是Descendents

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接