2012-04-01 15 views
0

私は、サーバー上の次のメソッド(RIAサービス)があります。これらの項目は、IEnumerableを<としてクライアントにロードされているEF既に読み込まれたエンティティを関連付ける方法は?

public IQueryable<Customer> GetCustomers() 
{ 
    return ObjectContext.Customers; 
} 

public IQueryable<Customer> GetCustomersWithInvoicesAndInvoiceItemsAsync() 
{ 
    return ObjectContext.Customers 
     .Include("Invoices.InvoiceItems"); 
} 

>を、CollectionAと収集Bに名前を付けることができます。私の問題は次にあります:CollectionAで顧客を追加/削除すると、CollectionBはそれを認識しません。両方のコレクションに同じエンティティが含まれているため、編集は期待通りに機能しています。請求書を別々にロードしてクライアントに関連付ける方法はありますか?したがって、私は2つではなく、1つの顧客のコレクションだけで作業しますか?

+0

あなたが請求書を取得し、顧客とそれらを結合することができますように、あなたの請求書は、CustomerIdのか持っている場合。 –

+0

はい、これは私の質問です。 2番目のクエリを実行したのと同じ結果が得られますか? – Goran

答えて

0

サービス側(GetCustomersメソッドの横):

public IQueryable<Invoice> GetInvoicesAndInvoiceItemsAsync() 
{ 
    return ObjectContext.Invoices.Include("InvoiceItems"); 
} 

クライアント側、(IEnumerable Sなど)別の呼び出しで、顧客や請求書を取得した後:

var query = customers.Join(invoices, c => c.CustomerId, i => i.CustomerId, 
    (c,i) => Tuple.Create(c, i)); 

この意志顧客と請求書のペアのリストを提供します。または、GroupJoinを使用してください:

var query = customers.GroupJoin(invoices, c => c.CustomerId, i => i.CustomerId, 
    (c,i) => Tuple.Create(c, i)); 

これは、顧客請求書(複数)のリストを表示します。

+0

こんにちはGertArnold、遅くまで申し訳ありませんでしたが、私は今日まであなたのアドバイスを試すことができませんでした。結果は、私が探していたものと同じではありません。 2番目の例のクエリ – Goran

+0

のように、私は顧客オブジェクトのリストを受け取る必要がありましたが、私はTupleオブジェクトのリストを受け取っていますが、あなたは 'Customer'の請求書コレクションを変更する必要があります。あなたはこのコレクションに請求書を追加することができますが、私はEFによって変更追跡されたコレクションを改ざんしないことを望みます。おそらく、マッピングされていない請求書コレクションをCustomerクラスに追加することができます。 –

+0

クライアント上のコレクション(元リスト)は変更追跡されていません。コレクション内のエンティティのみが変更追跡中です。あなたが提供したソリューションは、Tupleコレクション内に顧客をラッピングしているため、元の顧客コレクションとは何の関係もありません。元の顧客コレクションに顧客を追加する場合、タプルコレクションはそれについて何も知らないでしょう。手動で項目を追加する以外の方法はありませんか? – Goran

関連する問題