web-dev-qa-db-ja.com

LINQを使用してネストされたエンティティを含める

私は初めて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()については知っていますが、複数のエンティティに適用する方法がわかりません。

すべての助けに大いに感謝します。

20
Will Bithell

ここにインクルードを使用することを心配しないでください

次のようなことをしてください

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

10
msarchet

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()はできません。

14
Kirk Broadhurst

文字列リテラルを使用せずにネストされたエンティティを含めるには、次のようにSelectを使用します。

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