EF学習雑記3:貪欲なロードをどのように使用するか
3672 ワード
貪欲なロードを使用する必要があるのはいつですか?
通常、あなたのプログラムでは、クエリーされたエンティティに対してどのような操作が行われるか知っています.
たとえば、顧客の再印刷のために受注を問合せた場合、受注を構成していないプロジェクト、すなわち製品の情報再印刷が不完全であることを知っています.そのため、これらの情報を同時にロードする必要があることを知っています.
これは貪欲なロードが機能するシーンです.
追加情報やエンティティが必要であることを知っている場合は、将来のクエリーを省くため、これらのエンティティ(貪欲なロード)を事前にロードすることもできます.
貪欲なロードはどのように行いますか?
一般的に存在するいくつかの誤った観念とは逆に、Entity Frameworkでは貪欲なロードが実行可能であり、実行しやすく、Include()メソッドのみを使用して次のようにクエリーを開始すればよい.
このクエリは、クエリ条件を満たすorderごとに「Items」を含むとともに、各Itemにも「Product」を含むことを意味する.
この結果、次のコードが得られます.
新しいクエリーはもう必要ありません.
注意:
明示的なInclude(「Items」)は必要ありません.Include(「Items.Product」)の呼び出しには、Itemsが暗黙的に含まれます.
通常、あなたのプログラムでは、クエリーされたエンティティに対してどのような操作が行われるか知っています.
たとえば、顧客の再印刷のために受注を問合せた場合、受注を構成していないプロジェクト、すなわち製品の情報再印刷が不完全であることを知っています.そのため、これらの情報を同時にロードする必要があることを知っています.
これは貪欲なロードが機能するシーンです.
追加情報やエンティティが必要であることを知っている場合は、将来のクエリーを省くため、これらのエンティティ(貪欲なロード)を事前にロードすることもできます.
貪欲なロードはどのように行いますか?
一般的に存在するいくつかの誤った観念とは逆に、Entity Frameworkでは貪欲なロードが実行可能であり、実行しやすく、Include()メソッドのみを使用して次のようにクエリーを開始すればよい.
var reprint = (from order in ctx.Orders.Include("Items.Product")
where order.Customer.Name == "Fred Blogs"
&& order.Status == "Unshipped"
select order).First();
このクエリは、クエリ条件を満たすorderごとに「Items」を含むとともに、各Itemにも「Product」を含むことを意味する.
この結果、次のコードが得られます.
foreach (var item in reprint.Items)
{
Console.WriteLine("\t{0} {1} = ${2}",
item.Quantity,
item.Product.Name,
item.Cost);
}
Console.WriteLine(reprint.TotalCost);
新しいクエリーはもう必要ありません.
注意:
明示的なInclude(「Items」)は必要ありません.Include(「Items.Product」)の呼び出しには、Itemsが暗黙的に含まれます.