2016-08-05 7 views
0

です:はどのように負荷EFクラスを行うと、それは私が二つのテーブル持っているリレーショナルクラス

MY_TABLE 
ID CODE VERSION DESCRIPTION 
1 AAA 1  A Test 

MY_CHILD_TABLE 
ID CODE VERSION COLOR 
1 AAA 1  Blue 

どちらが私のEFモデルに含まれているが、両方のテーブルの上のナビゲーションプロパティの設定があります。

今、私は、データを取得するために以下のクラスを持っている:私はMY_TABLEのためのデータだけをしたい場合は

public static MyData GetMyData(string Code, string version) 
{ 
    using (var context = new Entities()) 
    { 
     return context.MY_TABLE.Where(x => x.MY_CODE == Code && x.MY_VERSION == version).FirstOrDefault(); 
    } 
} 

これは問題ありません。 しかし、今私は、両方のMY_TABLEとMY_CHILD_TABLEデータが返されるようにするシナリオを持っています。

どのように情報を返すことができますか?私はGetMyData方法でコンテキストを閉じていますので、これは動作しません正しく理解していれば

var result = MyClass.GetMyData("aaa",1); 
var color = result.NAV_PROP.Color; 

:私はの効果に何かをできるようにしたい
すなわち。あなたは、ナビゲーションプロパティを持っている場合は

答えて

1

それを行うには、2つの方法がありますが、あなたは(EF上のデフォルトの設定である)を有効に遅延読み込みたら。

1)あなたの関係は「必須」外部キー関係になるように構成されている場合は、EFはあなたが

を「内部結合」やっているのを理解するだろう

context.Table.Include(t => t.RelatedTable).Where(x => ..Condition..).FirstOrDefault(); 

「を含める」の拡張子を使用してくださいあなたの関係が "Nullable"(必須ではない)に設定されている場合、EFはあなたが "Left Join"を行っていることを理解します。

2)データが列挙される前に.Selectを使用して関連データを選択します。この場合には

context.Table.Where(x = ..Conditions..).Select(s => 
    new { 
      RelatedTableColumn = s.RelatedTable.Column 
      ... 
    }).FirstOrDefault(); 

EFは、あなたが「含める」を使用してのように「内部結合」、しかし、それだけで大きなクエリのパフォーマンスが向上し、あなたの「選択」列を返しますやっているのを理解するだろう。

編集1

Psの*:あなたは ".INCLUDE" の拡張子にアクセスすることができない場合は、単に追加:

using System.Data.Entity; 
1

は、単にそれらを含める:

return context.MY_TABLE.Include(x=>x.MY_CHILD_TABLEProperty).Where(x => x.MY_CODE == Code && x.MY_VERSION == version).FirstOrDefault(); 
+0

私は私のメソッドを含める内のxの値を持っていません。 – PrivateJoker

+0

あなたはナビゲーションプロパティを持っていると言いました。あなたのefクラスの構造を表示します –

+1

@ JDSは参照を追加します:using System.Data.Entity; –

関連する問題