返回LINQ查询以在视图中查看和循环遍历结果。
返回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 @foreach (var p in Model) { @p.Project.Title foreach (var tag in p.Tags) { @tag.title } }
我得到以下错误:
传递给字典的模型项的类型为 \'System.Collections.Generic.List
1[<>f__AnonymousType6
2[portfolio.Models.Project,System.Collections.Generic.IEnumerable1[portfolio.Models.ProjectTag]]]\',但这个字典需要一个模型项的类型为 \'System.Collections.Generic.IEnumerable
1[portfolio.Models.ProjectHasTag]\'。
ProjectHasTag模型的代码如下:
public class ProjectHasTag { public int ID { get; set; } public int? ProjectId { get; set; } [ForeignKey("ProjectId")] [DisplayName("Project")] public virtual Project Project { get; set; } public int? TagId { get; set; } [ForeignKey("TagId")] [DisplayName("Tag")] public virtual ProjectTag ProjectTag { get; set; } public virtual ICollection Tags { get; set; } }
这就是我想要实现的:
http://i.stack.imgur.com/DAZ5n.png(我还不能发布图片)
感谢您抽出时间来看,英语不是我的母语。
在查询的选择部分,你创建了一个匿名对象,而你的模型需要类型为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) };
问题出在您查询的这部分:
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 ICollectionTags { get; set; }
更新二
我忘记了 Entity Framework (EF) 在直接实例化实体类型时很挑剔。为了快速解决,您应该能够从匿名类型映射到实体类型(如这里描述的那样)。
然而,EF 这样做实际上是一件好事,因为它迫使您采用一种设计策略,这将使您能够利用 MVC 的更多功能。特别是,现在是学习 ViewModel 的好时机(参见:ASP.NET MVC - 如何使用 ViewModel 和 http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx)。