2011-08-12 18 views
1

リレーションシップはおそらく間違っていますが、データテーブルは前に使用したものです。私はSQLデータベースからEF4を取得しています。顧客、会社、部署のような表。選択のために通常コンボボックスに入るもの。私はそれらを静的リストに保持しています(アプリケーションの起動時に作成する必要があります)。いくつかのコンボボックスitemsourceがバインドされています。これにより、ViewModelから選択した項目をバインドすることによって特定の選択肢を簡単に関連付けるように設定します。WPF、EF4、およびリレーション

私の問題は、いくつかの場所では、表示用にデータグリッド内のIDに関連付けられた名前が必要なだけです。会社名が必要なCompanyIdを含む数百行。私はここでパフォーマンスが心配です。 DB FKを使用して検索中に名前を取得することはできますが、静的リスト内にあるので、それは無駄に思えます。また、Lazyローディングが、データバインディング中に、または最初のクエリ中に参照されることを意味するかどうかもわかりません。

ここで最善の解決策は何ですか?静的リストを使用してwpf値コンバータを作成できますか?私はそれを取得した後、データのforeachを実行し、静的リストの値を見て、オブジェクトに名前を格納する必要がありますか?

答えて

1

あなたはあなたのクエリにこのロジックを構築することができ:

var viewModels = (from c in objectContext.Customers 
       select new MyGridViewModel { 
         CustomerId = c.CustomerId, 
         CompanyId = c.CompanyId, 
         CompanyName = c.Company.Name 
       }).ToList(); 

これはあなたのすべての列をフェッチする必要がなくなります(唯一のCustomerId、たCompanyId、および会社名が返されますあなたもなりません。 。グリッドに怠惰なお客様の会社のロード

その後のことができ、単純なバインドビューモデル:

myGrid.ItemsSource = viewModels; 
+0

私の唯一の懸念は、このソリューションでは、SQLルックアップ「c.Company.Name」を100回実行することがパフォーマンス上の問題である可能性があることです。アプリケーションがすでに取り込んだリストを使用してこれを行うことができれば、よりうまくいくと思います。もちろん、それは私の質問です。もしあなたがその問題を考えないなら、私はそれにつきます。 – Tyrsius

+0

それはできません。上記の例では、すべての結果を返す単一のクエリを実行します。これは、結合およびネストされたクエリを使用して、CustomerIdと同じクエリでCompanyNameを取得します。 – Jeff

0

は、あなただけの必要な静的データを挿入できませんでしたComboBoxをそれぞれのViewModelのコンストラクタに追加しますか?

たとえば、コンストラクタでList<Customer> customersを渡すか、エンティティオブジェクトの使用を避けたい場合は、List<CustomerViewModel> customerViewModelsを渡すことができます。List<CustomerViewModel> customerViewModelsには、コンボボックスに入力するために必要な列だけが含まれています。

依存性注入フレームワークを使用している場合は、これは特に簡単ですが、そうでない場合でも、それほど悪くはありません。

+0

私は実際にこれが私の質問にどう関係しているのか分かりません。はい、私はそれを行うことができましたが、それはどのように私の仕事を達成するでしょうか?また、質問はコンボボックスに関するものではありません。もう一度お読みください。 – Tyrsius

+0

私はValueConverterを作ることに関するあなたの声明に集中していました。私はValueConverterが必要であるとは思わない - 必要なデータをViewModelに注入することができます。それは、JeffN825の答えは実際には私にとってかなり確かなようだ。私はWPFアプリケーションのためのいくつかの余分なデータベースクエリについては心配しません。 SQL Serverのようなデータベースは、膨大な負荷を処理するように設計されています。いくつかの外部キー結合を避けるために、さまざまなクエリ結果を保存しようとするのは時期尚早の最適化の例であることは間違いありません。パフォーマンスが問題になる場合は、静的リストにデータの一部をキャッシュすることができます。 – devuxer

関連する問題