1

我的應用程序必須處理大量數據,通常選擇大小約爲10000行。爲了提高性能,建議只選擇所需的數據。Linq to SQL:Projections,ViewModels,不可翻譯的查詢

當我必須做計算或任何有意義的業務,我很樂意選擇所有的數據,以正確實例化我的模型,所以我可以依靠它的功能。

當僅查看數據(通常在表格中)時,這不是我想要的,我想將檢索的數據量限制爲絕對最小值。

到目前爲止,我已經使用了以下的方法來從我的資料庫中獲取數據(如下圖所示是做所有的魔法庫中的方法:

private IEnumerable<TResult> GetAllProject<TResult>(Expression<Func<T, TResult>> selector, Expression<Func<T, bool>> predicate) 
{ 
    SetReadContext(); 
    var query = DataContex.Table<Order>().Where(predicate).Select(selector); 

    return query.ToList(); 
} 

這樣,我有類型定義對於調用存儲庫的方法中的匿名類型,我可以透明地使用該類型。

每個控制器都可以準確定義傳遞給視圖的數據,它非常有效,因爲我可以直接影響列排序等無需處理電網控制在視圖中爲我做到這一點。我不需要DataContext上的任何LoadOptions,因爲它根據選擇器計算出來。

現在的問題是,我沒有控制傳遞給我的知識庫的選擇器。它可能也包含方法調用等不可翻譯。

我的問題是:

  1. 到目前爲止,我已經避免了,因爲我害怕發生爆炸產生的ViewModels。什麼是實施它們的最佳方式?我應該讓選擇器可以爲我預測嗎?
  2. 我應該編寫單元測試嗎?除了查詢執行之外,什麼都不檢查?

回答

1

我建議你創建ViewModels,這樣你就可以使用已知的一組類,Type Explosion並不是真正的問題,因爲你目前使用的是匿名類型,這可能有點困難管理。

如果您(通常)每個視圖都有一個ViewModel,那麼它會變得很乾淨。在某些情況下,你甚至可以共享你的ViewModel,儘管我會推薦它,因爲遲早有一個消費者最終需要更多的數據/字段,另一個最終會產生一個臃腫的ViewModel。

+0

我應該在哪裏放置我的ViewModels呢?編號喜歡讓他們分開,但我需要引用他們在我的dataAcess層爲了在那裏定義選擇器。或者我應該在其他地方定義選擇器並單獨測試它們? – 2009-09-11 15:48:40

+0

考慮到您的ViewModel純粹是爲了服務View而完成的數據轉換/縮減,那麼它就屬於它的View(或靠近)。選擇器只是ViewModel代碼的一部分,應像其他任何代碼一樣進行測試(不論語言或語法如何)。 – 2009-09-12 11:50:57