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式でそれらのオブジェクトを取得する方法はありますか?
この "クエリ結果の整形" 記事で.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
ロバートの答えに加えて、文字列の代わりに式を使用して.Include()を実行できる拡張メソッドのオプションについて、この質問をチェックアウトすると、コンパイル時のチェックを取得できます。
知る限り、silverlight(ドメインサービス)の場合、[Include]属性を適切な場所(メタデータのナビゲーションプロパティ上)に追加するだけで十分です https://stackoverflow.com/a/5332188/413032