2011-06-29 56 views
0

我在我的控制器中的查詢獲取所有的應用程序,幷包括他們的平均評級從另一個表傳遞到字典的模型產品類型.... {} Models.App但我通過爲{Models.App,System.Double}

var apps = from a in db.Apps 
      let rating = a.Ratings.Average(r => r.Stars) 
      select new { App = a, Rating = rating == null ? 0 : rating }; 

然後,我命令他們在此基礎上過濾器從家裏....沒什麼大不了過去了....

switch (sortOrder) 
     { 
      case "Top desc": 
       apps = apps.OrderByDescending(a => a.Rating); 
       break; 
      case "Newest": 
       apps = apps.OrderBy(a => a.App.DateUpdated); 
       break; 
      case "Newest desc": 
       apps = apps.OrderByDescending(a => a.App.DateUpdated); 
       break; 
      default: 
       apps = apps.OrderBy(a => a.Rating); 
       break; 
     } 

然後返回到視圖

return View(apps.ToPagedList(pageIndex, pageSize)); 

但是,在主頁上,我收到一個錯誤,指出我正在傳遞錯誤類型的模型Item,我正在傳遞{Model.App,System。雙}(我想是因爲我的查詢增加了評級平均的方式......我怎麼能仍然得到一個等級平均水平,但發回合適的型號項目類型。謝謝!

+0

請張貼*確切*錯誤消息。 –

+0

傳遞到詞典中的模型項的類型爲「PagedList.PagedList'1 [<> f__AnonymousType1'2 [MarketplaceFinal.Models.App,System.Double]]」,但是這需要字典類型的「一個模型項PagedList.IPagedList '1 [MarketplaceFinal.Models.App]」。 –

回答

2

不要在您的視圖中傳遞匿名類型。定義視圖模型:

public class MyViewModel 
{ 
    public App App { get; set; } 
    public double Rating { get; set; } 
} 

然後:

var apps = 
    from a in db.Apps 
    let rating = a.Ratings.Average(r => r.Stars) 
    select new MyViewModel 
    { 
     App = a, 
     Rating = rating == null ? 0 : rating 
    }; 

,然後強類型視圖這個視圖模型。

@model PagedList.IPagedList<MarketplaceFinal.Models.MyViewModel> 
+0

謝謝,這很好!我現在在我的視圖中,我將需要引用這些對象作爲item.App.Name而不是簡單的item.Name? –

+0

@ user589482,是的,正好。 –

0

因爲要創建一個匿名類型,有兩種方法可以解決這個問題,第一種方法是改變你的預期模型的類型dynamic,但是我建議你不要使用匿名類型並創建一個新類,如AppWithRating,看起來像這樣:

public class AppWithRating 
{ 
    public App App { get; set; } 
    public double Rating { get; set; } 
} 

更改您LINQ查詢到這一點:

var apps = from a in db.Apps 
      let rating = a.Ratings.Average(r => r.Stars) 
      select new AppWithRating { App = a, Rating = rating == null ? 0 : rating }; 

最後更新您的視圖以接受類型IEnumerable<AppWithRating>

相關問題