我第一次搞乱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()
,但不确定如何将其应用于多个实体。
所有人都非常感谢。
答案 0 :(得分:14)
使用Include
。这是Include
的目的,没有理由编写一堆嵌套的select语句。
context.Releases.Include("OriginalTracks.OriginalArtist")
.Where(release => release.ReleaseID == id);
编写起来更简单,阅读更简单,并保留现有的数据结构。
要使用Include
,您需要指定要返回的属性的名称 - 这意味着代码中存在的名称,而不是数据库中的名称。例如:
.Include("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);