2009-06-13 8 views
1

エンティティタイプCustomerを参照するエンティティタイプOrderがあります。 条件に基づいてOrderのリストを返す関数インポートがあります。この注文リストは、表示されているデータグリッドに表示されますEntityReference.Load()を使用せずに手動でEntityReferenceをロードする方法

受注| Order.Customer.Name | Order。Total

Customer.Nameが表示されるリスト内の各OrderでCustomerReferenceをロードする必要がありますが、Order.CustomerReference.Load()を呼び出すたびにSQL Serverに往復して全体のプロセスは非常に非効率的です。問題は、リスト内のすべての注文のすべての顧客データを取得する単一のクエリがある場合、各注文のCustomerReferenceを手動で入力するにはどうすればいいですか?

基本的には、関数importで.Include( "Customer")を実行する必要があります。

おかげ

答えて

2

あなたが一度にすべての関連の顧客を思い出させるクエリを実行する場合は、手動で各CustomerReferenceを移入する必要はありません。これは、リレーションシップフィックスアップと呼ばれるものが自動的にあなたのためにこれを行うためです。

つまり、あなたがこれを行う場合:

Order o = ctx.Orders.First(o => o.Customer.ID == 1); 
// at this point o.Customer == null 

Customer c = ctx.Customers.First(c => c.ID == 1); 
// at this point o.Customer == c 

を関係フィックスアップは、顧客がコンテキストに入った後、関連するすべてのオブジェクトが自動的に今それを指すことを意味します...

すなわち、これはあなたが思うよりはるかに簡単です!

希望これは

アレックス

-1

を助けおかげでアレックスは、私はそれを試してみました。あなたが言ったように動作しますが、明らかに派生したエンティティタイプでは機能しません。 Order Entity Typeは、派生クラスSaleを持つ抽象基本クラスです。

Order o1 = ctx.Orders.First(o => o.Customer.ID == 1); 
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First(); 

Customer c = ctx.Customers.First(c => c.ID == 1); 
Customer c2 = ctx.Customers.First(c => c.ID == 2); 
//At this point o.Customer == c but s1.Customer is still null 

関数のインポートの戻り値の型は、抽象的で返される型ではないため、Orderとして設定することはできません。

私はここで何が欠けていますか?

アップデート: 私はO1とS1の間に違いがあります顧客がロードされる前に o1.CustomerReference.IsLoadedが o1.CustomerReference.EntityKeyは、ID = 2

s1.CustomerReference.IsLoadedではFalseです判明False s1.CustomerReference.EntityKey is null

しかし、s1.CustomerReference.Load()を呼び出すと、Customerデータが正しく読み込まれます。 私はGetSaleByCustomerID関数のインポート(単に "SELECT * FROM Customers = ID = 2")をダブルチェックして、参照で必要なCustomerIDフィールドを返します。

関連する問題