2016-08-11 9 views
1

データベースからエンティティをロードする必要があります。そのエンティティにデータベースからのほとんどすべてのリレーションを熱心に読み込む必要があります。私はIncludeを使ってみましたが、成功しませんでした。兄弟付きのEFエンティティをロードするには

var thingy = _ctx.MASTERANDCOMMANDER 
      .Include(x => x.RED) 
      .Include(x => x.RED.Select(y => y.RED_ONE)) 
      //.Include(x => x.RED.Select(y => y.RED_TWO)) 
      .Include(x => x.GREEN) 
      .Include(x => x.GREEN.Select(y => y.GREEN_ONE)) 
      .Include(x => x.GREEN.Select(y => y.GREEN_ONE.Select(z => z.GREEN_ONE_BIG))) 
      //.Include(x => x.GREEN.Select(y => y.GREEN_TWO)) 
      //.Include(x => x.GREEN.Select(y => y.GREEN_THREE)) 
      .SingleOrDefault(x => x.ID == "someId"); 

私はそれらのいずれかのコメントを解除する場合は含まれ、アプリがスロー: のSystem.Exception:オラクル11.2.0.2.0はEntityFramework 6とOracle 11.2を使用した

適用をサポートしていません。ここでは、コードです.0.2.0。 EFもOracleもアップグレードできません。

GREEN_TWOなどから関係をthingyにロードするにはどうすればよいですか?

編集:表示されるすべての関係は、左から右に1対多です。例:

  • RED(* 1)RED_ONE
  • GREEN_ONE(1 *)GREEN_ONE_BIG

答えて

2

いつでも使用できるが役立つだろう使用してIncludeの代わりにJoin、e。 G:

var thingy = _ctx.MASTERANDCOMMANDER 
    .Join(RED, x => x.MASTERANDCOMMANDERID, x => REDID, (m, r) => m)...etc... 

というように、あなたは別の単一のエンティティとしてデータベースからREDを取得する必要があります。

+0

実際にはlinq構文を使用して試してみましたが動作します...しかし、空のリレーションを持つアイテムがあれば空のオブジェクトを返します。左の結合を使用する...それらはC#で醜いです –

0

多分.ThenIncludeは()

var thingy = _ctx.MASTERANDCOMMANDER 
       .Include(x => x.RED) 
       .ThenInclude(red => red.RED_ONE) 
       .Include(x => x.GREEN) 
       .ThenInclude(green => green.GREEN_ONE) 
       .ThenInclude(greenOne => greenOne.GREEN_ONE_BIG)    
       .Where(x => x.ID == "someId").SingleOrDefault(); 
+0

このバージョンのEFにはそのメソッドがありません=( –