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

アップデート 2

Entity Framework (EF) は、エンティティ型を直接インスタンス化する際にうるさいことを忘れていました。簡単に修正するには、匿名型からエンティティ型にマップできる必要があります (ここで説明されているように)。

ただし、EF がこれを行うことは実際には良いことです。なぜなら、MVC からより多くの機能を活用できるようにする設計戦略を採用する必要があるからです。特に、これは ViewModel について学ぶ良い機会です ( ASP.NET MVC - View Models を正確に使用する方法http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-を参照)。 mvc-view-model-patterns.aspx )。

于 2013-11-03T16:47:39.973 に答える
0

クエリの選択部分で匿名オブジェクトを作成し、モデルにはオブジェクト フォーム タイプが必要です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 に答える