返回LINQ查询以在视图中查看和循环遍历结果。

9 浏览
0 Comments

返回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.List1[<>f__AnonymousType62[portfolio.Models.Project,System.Collections.Generic.IEnumerable1[portfolio.Models.ProjectTag]]]\',但这个字典需要一个模型项的类型为 \'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 Tags { get; set; }
}

这就是我想要实现的:

http://i.stack.imgur.com/DAZ5n.png(我还不能发布图片)

感谢您抽出时间来看,英语不是我的母语。

admin 更改状态以发布 2023年5月20日
0
0 Comments

在查询的选择部分,你创建了一个匿名对象,而你的模型需要类型为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
0 Comments

问题出在您查询的这部分:

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 Tags { get; set; }

更新二

我忘记了 Entity Framework (EF) 在直接实例化实体类型时很挑剔。为了快速解决,您应该能够从匿名类型映射到实体类型(如这里描述的那样)。

然而,EF 这样做实际上是一件好事,因为它迫使您采用一种设计策略,这将使您能够利用 MVC 的更多功能。特别是,现在是学习 ViewModel 的好时机(参见:ASP.NET MVC - 如何使用 ViewModelhttp://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx)。

0