【问题标题】:return LINQ query to view and loop through the results in the view返回 LINQ 查询以查看并循环查看视图中的结果
【发布时间】:2013-11-14 08:07:03
【问题描述】:

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

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.List1[&lt;&gt;f__AnonymousType62[portfolio.Models.Project,System.Collections.Generic.IEnumerable1[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(我还不能发图)

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

【问题讨论】:

标签: c# asp.net asp.net-mvc linq asp.net-mvc-4


【解决方案1】:

问题在于您的查询的这一部分:

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 的更多功能。特别是,这将是了解 ViewModel 的好时机(请参阅:ASP.NET MVC - How exactly to use View Modelshttp://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx)。

【讨论】:

  • 我收到以下错误:“portfolio.Models.ProjectHasTag”不包含“Tags”的定义,我的模型 ProjectHasTag 缺少什么?
  • 如果您可以编辑您的问题以包含ProjectHasTag 的代码,将会很有帮助。
  • 公共类 ProjectHasTag { public int ID { get;放; } 公共整数?项目 ID { 获取;放; } [ForeignKey("ProjectId")] [DisplayName("Project")] public virtual Project Project { get;放; } 公共整数?标签 ID { 获取;放; } [ForeignKey("TagId")] [DisplayName("Tag")] public virtual ProjectTag ProjectTag { get;放; } } 我将此代码添加到问题中。
  • @JorisP 更新了我的答案。
  • 似乎项目可以有多个标签,因为他正在通过 ProjectId 缩小 ProjectHasTags,然后通过加入 ProjectHasTags 中每个 TagId 的项目来找到实际的标签。我在想他可能想要将标签绑定到下拉列表,然后 ProjectTag 是从列表中选择的值,但似乎确实如此:)
【解决方案2】:

在查询的选择部分,您创建了一个匿名对象,并且您的模型需要对象表单类型为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)
                    };

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多