簡體   English   中英

返回LINQ查詢以查看並循環查看視圖中的結果

[英]return LINQ query to view and loop through the results in the view

我遇到了一個問題,我在我的控制器中進行了以下查詢:

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__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]' 1[portfolio.Models.ProjectTag]]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable

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 (我無法發布圖片)

感謝花時間,英語不是我的第一語言。

問題是這部分查詢:

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的更多功能。 特別是,這將是了解ViewModel的好時機(請參閱: ASP.NET MVC - 如何使用View Modelshttp://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net- mvc-view-model-patterns.aspx )。

在查詢的選擇部分中,您將創建一個匿名對象,並且您的模型需要表單類型為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)
                    };

由於你有一個ICollection,你告訴Linq,你希望你的ProjectTag是延遲加載的。 就像上面提到的@John H一樣,既然你已經將Tags屬性添加到了ProjectHasTag類中,你就可以填充它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM