web-dev-qa-db-ja.com

ReferenceプロパティまたはLoad()を呼び出す代わりに、LINQ to Entitiesクエリを構築して、子オブジェクトを直接ロードする方法

LINQ to Entities(またはEntity Frameworkが呼び出しているものは何でも)を使用するのは初めてで、次のようなコードをたくさん書いています。

var item = (from InventoryItem item in db.Inventory
            where item.ID == id
            select item).First<InventoryItem>();

次に、そのオブジェクトのメソッドを次のように呼び出します。

var type = item.ItemTypeReference;

または

var orders = item.OrderLineItems.Load();

子または関連オブジェクトを取得します。

DBのプロファイルを作成したり、深く掘り込んだりしていませんが、.Load()または* Referenceプロパティを呼び出すと、実際にはDBに別の呼び出しを行うことになります。この場合、最初のLINQ式でそれらのオブジェクトを取得する方法はありますか?

42
JC Grubbs

この "クエリ結果の整形" 記事で.Include(string)メソッド参照を使用したい場合。

var item = from InventoryItem item in
              db.Inventory.Include("ItemTypeReference").Include("OrderLineItems")
           where item.ID == id
           select item;

おそらくインクルードにも「SQL」スタイルの構文があります。

こちらもご覧ください 記事 LINQ-to-SQLからLINQ-to-Entitiesへの移行について。

Linq to SQLのこの問題の解決策を探している他の人のために、あなたは次のことをしたいです(あなたが持っているものは何でもDataContextと他の型に置き換えてください):

using (DataContext db = new DataContext())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference);
    options.LoadWith<InventoryItem>(ii => ii.OrderLineItems);
    db.LoadOptions = options;

    var item = from InventoryItem item in db.Inventory
               where item.ID == id
               select item;
}

これにより、特定のコンテキストの親アイテム(InventoryItem)が読み込まれるたびに、LoadWithで指定されたプロパティが読み込まれます。

ジェームズとジェスパーからのさらなる質問に答えて、これをチェックしてください question

62
Robert Wagner

ロバートの答えに加えて、文字列の代わりに式を使用して.Include()を実行できる拡張メソッドのオプションについて、この質問をチェックアウトすると、コンパイル時のチェックを取得できます。

Entity Framework .Include()コンパイル時チェック??

0

知る限り、silverlight(ドメインサービス)の場合、[Include]属性を適切な場所(メタデータのナビゲーションプロパティ上)に追加するだけで十分です https://stackoverflow.com/a/5332188/413032

0
Davut Gürbüz