1

我遇到了一个问题,我在控制器中进行了以下查询:

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
    }       
}

我收到以下错误:

传递到字典中的模型项的类型为“System.Collections.Generic.List 1[<>f__AnonymousType62[portfolio.Models.Project,System.Collections.Generic.IEnumerable 1[portfolio.Models.ProjectTag]]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[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<ProjectTag> Tags { get; set; }

}

这就是我想要实现的目标:http: //i.stack.imgur.com/DAZ5n.png(我还不能发布图片)

感谢您抽出宝贵时间,英语不是我的第一语言。

4

3 回答 3

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) 在直接实例化实体类型时很挑剔。为了快速修复,您应该能够从匿名类型映射到实体类型(如此所述)。

但是,EF 这样做实际上是一件好事,因为它迫使您采用一种设计策略,使您能够利用 MVC 的更多功能。特别是,这将是了解 ViewModels 的好时机(请参阅:ASP.NET MVC - 如何准确使用 View Modelshttp://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net- mvc-view-model-patterns.aspx)。

于 2013-11-03T16:47:39.973 回答
0

由于您有 ICollection ,因此您是在告诉 Linq,您希望您的 ProjectTags 被延迟加载。就像上面的@John H 所说,由于您已将 Tags 属性添加到 ProjectHasTag 类中,因此您可以这样填充它:

select new ProjectHasTag
{
    Project = pmtGroup.Key,
    Tags = pmtGroup.Select(project => project.ProjectTag)
};
于 2013-11-03T17:28:54.370 回答
0

在查询的选择部分,您创建了一个匿名对象,并且您的模型需要对象 form type 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)
                    };
于 2013-11-03T16:48:21.053 回答