使用LINQ包含嵌套实体

时间:2011-08-24 16:34:26

标签: linq entity-framework linq-to-entities

我第一次搞乱LINQ,我首先使用的是EF 4.1代码。

我有包含其他实体的嵌套列表的实体,例如:

class Release
{
    int ReleaseID { get; set; }
    string Title { get; set; }
    ICollection<OriginalTrack> OriginalTracks { get; set; }
}

class OriginalTrack
{
    int OriginalTrackID { get; set; }
    string Title { get; set; }
    ICollection<Release> Releases { get; set; }
    ICollection<OriginalArtist> OriginalArtists { get; set; }
}

class OriginalArtist
{
    int OriginalArtistID { get; set; }
    string Name { get; set; }
    ICollection<OriginalTrack> OriginalTracks { get; set; }
}

我想知道在一个LINQ查询中最快的方法是获取ReleaseID == some value所在的所有信息。

我已完成作业,但已找到需要使用所需数据隐式重建对象(通常是匿名)的解决方案。我希望数据以数据库中保存的确切格式从数据库中取出,即拉出具有相关ReleaseID的Release对象,并填充列表中的所有OriginalTrack和OriginalArtist数据。

我知道Include(),但不确定如何将其应用于多个实体。

所有人都非常感谢。

3 个答案:

答案 0 :(得分:14)

使用Include。这是Include的目的,没有理由编写一堆嵌套的select语句。

context.Releases.Include("OriginalTracks.OriginalArtist")
    .Where(release => release.ReleaseID == id);

编写起来更简单,阅读更简单,并保留现有的数据结构。

要使用Include,您需要指定要返回的属性的名称 - 这意味着代码中存在的名称,而不是数据库中的名称。例如:

  • .Include("OriginalTracks")将在每个版本
  • 中包含OriginalTracks属性
  • .Include("OriginalTracks.OriginalArtist")将在每个版本中包含OriginalTracks属性,并在每个曲目上包含OriginalArtist(请注意,在语法或逻辑上不可能包括OriginalArtist,包括OriginalTrack )< / LI>
  • .Include("OriginalTracks").Include("OtherProperty")将在每个版本中包含OriginalTracks和OtherProperty对象。

您可以根据需要链接尽可能多的这些内容,例如:

.Include("Tracks.Artist").Include("AnotherProperty")
    .Include("ThirdProperty.SomeItems").Where(r => r.something);

完全有效。唯一的要求是您将Include放在EntitySet上,而不是放在查询上 - 您不能.Where().Include()

答案 1 :(得分:10)

不要担心在这里使用包含

只需执行以下操作

var query = 
    from release in ctx.Releases
    select new {
        release,
        originalTracks = from track in release.OriginalTracks
                         select new {
                               track,
                               releases = track.Releases,
                               orignialArtist = from artist in track.OriginalArtists
                                                select new {
                                                     artist,
                                                     artist.OriginalTracks
                                                }
                         }
        }

var Releases = query.Select(x => x.Release);

应加载所有数据

我在这里处理了这篇文章的信息。

http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx

答案 2 :(得分:9)

要在不使用字符串文字的情况下包含嵌套实体,请使用Select,如下所示:

context.Releases.Include(r => r.OriginalTracks.Select(t => t.OriginalArtist))
    .Where(release => release.ReleaseID == id);