私は初めてLINQをいじり、最初にEF4.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; }
}
_
1つのLINQクエリで、where _ReleaseID == some value
_のすべての情報を取得する最も簡単な方法は何でしょうか。
私は宿題をしましたが、必要なデータを使用してオブジェクト(通常は匿名)を暗黙的に再構築する必要があるソリューションを見つけました。データベース内に保持されている正確な形式でデータベースからデータを取得する必要があります。つまり、関連するReleaseIDを使用してReleaseオブジェクトをプルすると、リスト内のすべてのOriginalTrackデータとOriginalArtistデータがプルされて入力されます。
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);
すべてのデータをロードする必要があります
私はここでこの投稿からの情報を扱いました。
http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx
Include
を使用します。これがInclude
の目的であり、ネストされたselectステートメントの束を作成する理由はありません。
_context.Releases.Include("OriginalTracks.OriginalArtist")
.Where(release => release.ReleaseID == id);
_
これにより、書き込みと読み取りが簡単になり、既存のデータ構造が保持されます。
Include
を使用するには、返すプロパティの名前を指定する必要があります。これは、データベースではなく、コードに存在する名前を意味します。例えば:
.Include("OriginalTracks")
には、各リリースにOriginalTracksプロパティが含まれます.Include("OriginalTracks.OriginalArtist")
には、各リリースにOriginalTracksプロパティが含まれ、各トラックにOriginalArtistが含まれます(構文的または論理的に-OriginalArtistをOriginalTrackに含めることはできません).Include("OriginalTracks").Include("OtherProperty")
には、各リリースのOriginalTracksオブジェクトとOtherPropertyオブジェクトが含まれます。たとえば、次のように、これらをいくつでもチェーンできます。
_.Include("Tracks.Artist").Include("AnotherProperty")
.Include("ThirdProperty.SomeItems").Where(r => r.something);
_
完全に有効です。唯一の要件は、クエリではなくEntitySetにInclude
を配置することです。.Where().Include()
はできません。
文字列リテラルを使用せずにネストされたエンティティを含めるには、次のようにSelect
を使用します。
context.Releases.Include(r => r.OriginalTracks.Select(t => t.OriginalArtist))
.Where(release => release.ReleaseID == id);