2011-08-12 67 views
1

關係可能是錯誤的詞語,但數據表是我以前使用過的。我有EF4從SQL數據庫拉。客戶,公司,部門等表格;通常進入Comboboxes進行選擇的事情。我把它們放在靜態列表中(只需要在應用程序啓動時填充),並且我有一些綁定到它們的組合框itemssource,通過綁定ViewModel中的選定項目,可以輕鬆設置「關聯」特定選擇。WPF,EF4和關係

我的問題是,在一些地方,我只需要一個與ID相關聯的名稱,以便僅顯示在數據網格中。幾百行需要成爲公司名稱的CompanyId。我很擔心這裏的表現。在查找過程中,我可以使用DB FK來獲取名稱,但這似乎是一種浪費,因爲我將它們都放在了靜態列表中。我也不知道延遲加載是否意味着它們會在數據綁定過程中或在初始查詢過程中被查找。

這裏最好的解決方案是什麼?你可以使用靜態列表製作一個wpf值轉換器嗎?我應該在獲取它之後對數據執行foreach,並且在靜態列表中查看值,將名稱存儲在對象中?

回答

1

你可以建立這個邏輯到你的查詢:

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

這將消除需要獲取所有的列(僅客戶編號,CompanyId和公司名稱將被退回你也不會

myGrid.ItemsSource = viewModels; 
+0

我唯一關心的這個解決方案是讓SQL查找'c.Company.Name'一百次可能是一個性能問題。如果應用程序可以使用它已經拉動的列表來做到這一點,我希望能夠更好地工作。當然,這是我的問題,所以如果你不認爲它是一個問題,我會與它一起去。 – Tyrsius

+0

它不會。上面的例子將執行一個查詢來返回所有結果。它使用連接和嵌套查詢在與CustomerId相同的查詢中獲取CompanyName。 – Jeff

0

你不能只是注入所需的靜態數據:可以簡單的綁定到網格的視圖模型懶加載客戶的公司

然後。將ComboBoxes插入到每個ViewModel的構造函數中?

例如,在您的構造函數中,您可能會傳入List<Customer> customers,或者如果您想避免使用實體對象,則可以傳入List<CustomerViewModel> customerViewModels,其中只有填充組合框所需的列。

如果你使用的是依賴注入框架,這將是特別容易的,但即使你不是,它也不會太壞,這是一個很好的習慣。

+0

我實際上並沒有看到這與我的問題有什麼關係。是的,我可以做到這一點,但這將如何完成我的任務?另外,問題不在於組合框,請再讀一遍。 – Tyrsius

+0

我專注於您製作ValueConverter的聲明。我不認爲ValueConverter應該是必要的 - 您可以將所需的數據注入ViewModels。也就是說,JeffN825的答案對我來說似乎非常穩固。我不擔心WPF應用程序的一些額外的數據庫查詢。 SQL Server等數據庫旨在處理巨大的負載。如果嘗試保存各種查詢結果以避免某些外鍵連接,那肯定會是過早優化的一個例子。如果性能成爲問題,那麼您可以嘗試在靜態列表中緩存一些數據。 – devuxer