2013-03-10 30 views
0

我在我的應用程序中有一個非常簡單的存儲庫模式,但是現在我有一個異議,我需要返回Code First Model和一些額外的數據。見下文。實體框架何時創建自定義DTO?

public IEnumerable<User> GetUsersWithinLocation(DbGeography geography) 

我真想包括在返回的模式是用戶實例,從地理的距離(以英里或其他)。

下面是我看到的選項:

選項1:我可以返回User對象名單,沒有距離,重新計算第二次的前端,並避免塞滿了我的數據模型,但似乎有點多餘..並且,這可能在某些情況下是不可能的,我只是覺得這種方法是錯誤的。

選項2:另一種選擇是創建一個新的DTO,該DTO由用戶構成或繼承,例如UserDistance對象。這會給我所需的一切,但是我會爲此創建一個新的存儲庫嗎?如果每種模型類型返回的數據有很多變化,我可以認爲這在大型應用程序中保持不穩定。

選項3:實現某種動態的ExtraData ViewBag排序圖層,我可以隨意傳遞額外的數據以及DTO。這會在我的圖層之間產生更緊密的耦合,因爲名稱必須是已知的。我也不太喜歡這種方法。

任何指導極大的讚賞。

+0

我會用'User'和距離創建'Model',類似於** Option 2 **,但不創建存儲庫,至少您需要存儲此信息。如果只是在某個時刻使用它,那麼你可以按照我剛纔所說的去做。希望我的意見能幫助你做出決定祝你好運!!! – ecampver 2013-03-10 06:13:19

+0

查看下面的答案...我基本上使用3的靈活性,強類型2,而不需要創建額外的對象。讓我知道如果你喜歡它(: – rodmjay 2013-03-10 07:09:00

+0

檢查我的答案下面,我認爲這就是你想要的:P – ecampver 2013-03-10 21:54:09

回答

1

這裏是方法來擺脫雙呼叫到Distance

public IDictionary<User, double?> GetUsersWithinByLocation(DbGeography geography) 
{ 
    return this.Query.Select(x => new KeyValuePair<User, double?>(x, x.Address.Location.Distance(geography))) 
        .OrderBy(kvp => kvp.Value) 
        .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
} 

你可以做其他的事情,我認爲這是一個更好一點是改變你的返回類型,這樣你就可以做一個簡單/更快的LINQ查詢,這裏是代碼:

public IEnumerable<KeyValuePair<User, double?>> GetUsersWithinByLocation(DbGeography geography) 
{ 
    return this.Query.Select(x => new KeyValuePair<User, double?>(x, x.Address.Location.Distance(geography))) 
        .OrderBy(kvp => kvp.Value); 
} 

這種方法可以使用,因爲它與KeyValuePair<T1, T2>,或者您可以使用Tuple<T1, T2>

請注意,在這兩種情況下我做了什麼是「存儲」首先Distance的計算,然後通過KeyValuePair<T1, T2>OrderBy子句中的Value屬性訪問它。

希望這有助於;)

0

這是怎麼回事?這裏有什麼問題?

public IDictionary<User, double?> GetUsersWithinByLocation(DbGeography geography) 
{ 
    return this.Query.OrderBy(x=>x.Address.Location.Distance(geography)) 
      .ToDictionary(x => x, x => x.Address.Location.Distance(geography)); 
} 

主要的問題是,我們兩次運行這個距離的功能,有沒有解決的辦法?

+0

嘿Rod你現在可以檢查我的新答案,讓我知道它是否有幫助 – ecampver 2013-03-11 04:45:58

0

我通常會問自己一個不同的問題:我可以使用數據傳輸域對象?很少有答案是肯定的。爲什麼會這樣?有很多情況下,UI通過域模型切片,並希望獲得一塊這樣的一塊。有(幾乎)總是包含一個視圖模型。大多數情況下,視圖模型都經過驗證。

所以對我來說:選項2。但是存儲庫不應該提供視圖模型。它應該是位於存儲庫和視圖之間的一個服務層(控制器,如果你在mvc中)並且編排庫調用來收集視圖模型的數據。這些存儲庫在內部公開了IQueryable,這些服務組成對這些IQueryables的查詢並公開IEnumerable

+0

我想我會同意除此之外,我的視圖模型往往有很多UI邏輯(UIHintAttribute),例如將ViewModels移動到服務層,因此ServiceLayer接口將導致大部分UI行爲與應用程序中最抽象的地方耦合。我認爲你本質上是建議一種DataViewModel,它表示可以在服務層中組成的數據表的邏輯切片。那麼你有DTO - > DataViewModel - > ViewModel ...只是太重了。 – rodmjay 2013-03-11 08:17:03