使用LINQ包含嵌套实体

Wil*_*ell 20 linq linq-to-entities entity-framework

我第一次搞乱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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我知道Include(),但不知道如何将它应用于多个实体.

所有帮助非常感谢.

Kir*_*rst 14

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

context.Releases.Include("OriginalTracks.OriginalArtist")
    .Where(release => release.ReleaseID == id);
Run Code Online (Sandbox Code Playgroud)

这样编写起来更简单,更易于阅读,并保留了现有的数据结构.

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

  • .Include("OriginalTracks") 将在每个版本中包含OriginalTracks属性
  • .Include("OriginalTracks.OriginalArtist")将在每个版本中包含OriginalTracks属性,并在每个轨道上包含OriginalArtist(请注意,在语法或逻辑上不可能包括原始艺术家包括OriginalTrack)
  • .Include("OriginalTracks").Include("OtherProperty") 将在每个版本上包含OriginalTracks和OtherProperty对象.

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

.Include("Tracks.Artist").Include("AnotherProperty")
    .Include("ThirdProperty.SomeItems").Where(r => r.something);
Run Code Online (Sandbox Code Playgroud)

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


msa*_*het 10

不要担心在这里使用include

只需执行以下操作即可

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);
Run Code Online (Sandbox Code Playgroud)

应加载您的所有数据

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

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


Edw*_*rey 9

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

context.Releases.Include(r => r.OriginalTracks.Select(t => t.OriginalArtist))
    .Where(release => release.ReleaseID == id);
Run Code Online (Sandbox Code Playgroud)