2012-07-24 70 views
2

我有一個MVC項目中的聚合數據視圖,該視圖顯示按審覈狀態細分的每月總數。控制器代碼設置這個了使用簡單的LINQ投影到一個匿名對象是這樣的:如果強烈鍵入LINQ投影

From audits In db.Audits 
Group By key = audits.DateCreated.Value.Month Into g = Group 
Select New With { 
    .Month = key, 
    .Assigned = g.Sum(AuditsWithStatus(AuditStatus.Issued)), 
    .Unassigned = g.Sum(AuditsWithStatus(AuditStatus.Pending)), 
    .Closed = g.Sum(AuditsWithStatus(AuditStatus.Closed)), 
    .Cancelled = g.Sum(AuditsWithStatus(AuditStatus.Cancelled)) 
} 

我知道這(使用匿名類型)的LINQ的一大優勢,但我不喜歡輸掉在視圖中強鍵入(即@ModelType SomeStrongType)。有關於此的一般建議嗎?文章,博客或其他地方處理該問題以及何時使用哪些內容?

+0

匿名類型在編譯時生成。從運行時的角度來看,它們仍然是強類型的 - 它們只有編譯器生成的名稱。 – 2012-07-24 12:41:14

回答

3

您不能對方法範圍之外的匿名類型進行任何操作。例如,您不能將它們返回到您的視圖。在這些情況下,你必須使用已知的類型。

當我選擇以另一種方式處理的數據時,我使用匿名類型。例如,使用Linq從1個源中選擇一些定製數據,然後放入另一個源。

如果您要返回聚合數據,如IEnumerable<IGrouping<TKey, TValue>>TKeyTValue是匿名類型(如果需要,可以按匿名類型進行分組);那麼你不想爲TKeyTValue創建2個類,其中TKey有一個覆蓋EqualsGetHashCode,所以你可以按它分組。然後,只需從中讀取一些值並將其扔掉,永遠不要重複使用。

TLDR;在不需要創建已知類型來存儲結果時使用它們。如果您需要將結果傳遞到方法範圍之外的某個位置,那麼您將需要一個類型。

0

一般建議很簡單:始終爲您的視圖創建專用視圖模型類型。在你的情況下,它會非常簡單,包含你在你匿名類中的屬性。

我明白,它似乎是一個不必要的開銷,但它會讓你的代碼更具可讀性和可驗證性。