2013-11-03 101 views
1

我在的地方,我已經在我的控制器作了如下的查詢問題上運行:返回LINQ查詢通過視圖結果查看和循環

var query = from pmt in db.ProjectHasTags 
      join project in db.Projects on pmt.ProjectId equals project.ID 
      join tag in db.ProjectTags 
       on pmt.TagId equals tag.ID 
       group pmt by pmt.Project into pmtGroup 
        select new 
        { 
         Project = pmtGroup.Key, 
         Tags = pmtGroup.Select(project => project.ProjectTag) 
        }; 

我想把這個查詢返回到圖使用:

return View(query.ToList()); 

在我有以下代碼視圖文件:

@model IEnumerable<portfolio.Models.ProjectHasTag> 

@foreach (var p in Model) 
{ 
    @p.Project.Title 

    foreach (var tag in p.Tags) 
    { 
     @tag.title 
    }  
} 

我得到以下錯誤:

The model item passed into the dictionary is of type 'System.Collections.Generic.List 1[<>f__AnonymousType6 2[portfolio.Models.Project,System.Collections.Generic.IEnumerable 1[portfolio.Models.ProjectTag]]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1[portfolio.Models.ProjectHasTag]'.

的ProjectHasTag型號代碼:

​​

這就是我想要達到的目標: http://i.stack.imgur.com/DAZ5n.png(我不能發表圖片還)

感謝您抽出寶貴的時間,英語不是我的第一語言。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

4

的問題是查詢的這個部分:

select new 
{ 
    Project = pmtGroup.Key, 
    Tags = pmtGroup.Select(project => project.ProjectTag) 
}; 

你不指定應該實例化的類型,所以它創建一個匿名類型,然後將其傳遞到您的視圖。你可能想是這樣的:

select new ProjectHasTag 
{ 
    Project = pmtGroup.Key, 
    Tags = pmtGroup.Select(project => project.ProjectTag) 
}; 

更新

正如錯誤是告訴你,ProjectHasTag沒有Tags財產。它看起來像你想要什麼是真正的:

select new ProjectHasTag 
{ 
    Project = pmtGroup.Key, 
    ProjectTag = pmtGroup.Select(project => project.ProjectTag) 
}; 

然而,這是一個有點不清楚你想要做的,因爲在你看來它看起來好像你必須爲每個項目多個標籤是什麼,在這種情況下,應該真的是一個集合。喜歡的東西:

public virtual ICollection<ProjectTag> Tags { get; set; } 

更新兩個

我忘了實體框架(EF)是挑剔的,當涉及到直接實例化實體類型。爲了快速解決問題,您應該能夠從匿名類型映射到實體類型(如here所述)。

但是,EF做這件事實際上是一件好事,因爲它迫使您採用一種設計策略,可以讓您利用MVC的更多功能。特別是,這將是瞭解ViewModels的好時機(請參閱:ASP.NET MVC - How exactly to use View Modelshttp://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx)。

+0

我收到以下錯誤:'portfolio.Models.ProjectHasTag'不包含'標籤'的定義,我的模型ProjectHasTag缺少一些東西? – JorisP

+0

如果您可以編輯您的問題以包含「ProjectHasTag」的代碼,將會很有幫助。 –

+0

public class ProjectHasTag { public int ID {get;組; } public int? ProjectId {get;組; } [ForeignKey(「ProjectId」)] [DisplayName(「Project」)] public virtual Project Project {get;組; } public int? TagId {get;組; } [ForeignKey(「TagId」)] [DisplayName(「Tag」)] public virtual ProjectTag ProjectTag {get;組; } }我將此代碼添加到問題中。 – JorisP

0

在查詢的選定部分中,您將創建一個匿名對象,並且您的模型需要對象表單類型爲ProjectHasTag。因此,這應該像(看select new ProjectHasTag):

var query = from pmt in db.ProjectHasTags 
      join project in db.Projects on pmt.ProjectId equals project.ID 
      join tag in db.ProjectTags 
       on pmt.TagId equals tag.ID 
       group pmt by pmt.Project into pmtGroup 
        select new ProjectHasTag 
        { 
         Project = pmtGroup.Key, 
         Tags = pmtGroup.Select(project => project.ProjectTag) 
        }; 
0

既然你有一個ICollection的,你告訴LINQ中,您希望您ProjectTags偷懶加載。就像@John H上面所說的,因爲你已經將Tags屬性添加到你的ProjectHasTag類中,所以你可以填充它:

select new ProjectHasTag 
{ 
    Project = pmtGroup.Key, 
    Tags = pmtGroup.Select(project => project.ProjectTag) 
};