2012-06-29 43 views
0

當我試圖通過LINQ查詢的結果爲MVC.Webgrid我收到錯誤(簡體):EF MVC的LINQ - 錯誤傳遞模型到MVC的WebGrid

The model item passed into the dictionary is of 
type'System.Data.Entity.Infrastructure.DbQuery but 
this dictionary requires a model item of type 
'System.Collections.Generic.IEnumerable`1[MyModel.Models.MyMetric]' 

這是的ActionResult失敗:

public ActionResult Test() 
    { 
     var metrics = db.Metrics 
      .GroupBy(c => c.Year) 
      .Select(g => new 
      { 
       Year = g.Key, 
       Q1 = g.Where(c => c.Quarter == 1).Sum(c => c.Value), 
       Q2 = g.Where(c => c.Quarter == 2).Sum(c => c.Value), 
       Q3 = g.Where(c => c.Quarter == 3).Sum(c => c.Value), 
       Q4 = g.Where(c => c.Quarter == 4).Sum(c => c.Value) 
      });       
     return View(metrics); 
    } 

我假設,因爲我創造,我需要建立某種形式的新模型對原始數據的支點,但我不確定該怎麼做,在這種情況下。 (只是讓我的腳溼透EF和MVC)

任何想法?

TIA Ĵ

回答

3

你傳遞一個匿名類型的圖,而你應該通過一個IEnumerable<MyMetric>。因此,假設MyMetric看起來是這樣的:

public class MyMetric 
{ 
    public int Year { get; set; } 
    public int Q1 { get; set; } 
    public int Q2 { get; set; } 
    public int Q3 { get; set; } 
    public int Q4 { get; set; } 
} 

你只需從你的LINQ查詢返回一個IEnumerable<MyMetric>

public ActionResult Test() 
{ 
    var metrics = db.Metrics 
     .GroupBy(c => c.Year) 
     .Select(g => new MyMetric 
     { 
      Year = g.Key, 
      Q1 = g.Where(c => c.Quarter == 1).Sum(c => c.Value), 
      Q2 = g.Where(c => c.Quarter == 2).Sum(c => c.Value), 
      Q3 = g.Where(c => c.Quarter == 3).Sum(c => c.Value), 
      Q4 = g.Where(c => c.Quarter == 4).Sum(c => c.Value) 
     });       
    return View(metrics); 
} 
+0

所以我需要創建MyMetric類?正如我目前擁有它,我只是返回「查詢」的結果作爲匿名類型。 –

+1

是的,你必須創建MyMetrics類。這被稱爲視圖模型。您不能將匿名對象傳遞給視圖。 –

+0

我在你的答案中丟失了一些東西。我試圖實現你的示例,仍然會得到相同的錯誤。 「MyMetric」如何使「指標」成爲IEnumerable? –

相關問題