2017-05-11 3 views
0

2つのデータベーステーブルのLinqで結合をしようとするといくつかのエラーが戻ってきた。私のデータベースには、参加者用テーブルとGender用テーブルがあります。 私は3つのモデルを使用しています - Participant、Gender、ParticipantDetailsViewModel。 (最終的には、より多くのデータ抽象化(例えば、都市の表)を可能にするために、他の参加者の詳細を切り替えたい)。私のC言語でLinqに参加しようとするとエラーが発生し、ViewModelを返す。C#MVC

参加

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace MVCManageParticipants.Models 
{ 
    public class Participant 
    { 
     public int Id { get; set; } 
     public int SiteId { get; set; } 
     public int Status { get; set; } 
     public int Gender { get; set; } 
     public string Title { get; set; } 
     [Required] 
     [StringLength(35)] 
     public string Name { get; set; } 
     public string City { get; set; } 
     public string Postcode { get; set; } 
     public string Telephone { get; set; } 
     public string Notes { get; set; } 
    } 
} 

性別

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace MVCManageParticipants.Models 
{ 
    public class Gender 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

ParticipantDetailsViewModel

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MVCManageParticipants.Models 
{ 
    public class ParticipantDetailsViewModel 
    { 
     public int Id { get; set; } 
     public int SiteId { get; set; } 
     public int Status { get; set; } 
     public string Title { get; set; } 
     public string Gender { get; set; } 
     public string Name { get; set; } 
     public string City { get; set; } 
     public string Country { get; set; } 
     public string Postcode { get; set; } 
     public string Telephone { get; set; } 
     public string Notes { get; set; } 
    } 
} 

テストのために model results view

:私は、コントローラからモデルを返すに取得し、結果ビューに次のように持っているアプリをデバッグするとき

public ActionResult Details([Bind(Prefix = "id")]int participantId = 0) 
     { 
      // Check participant exists 
      Participant participant = _db.Participants.Find(participantId); 

      if (participant == null) 
      { 
       return HttpNotFound(); 
      } 

      var model = (from p in _db.Participants 
         join g in _db.Genders on p.Gender equals g.Id 
         where p.Id == participantId 
         select new ParticipantDetailsViewModel 
         { 
          Id = p.Id, 
          SiteId = p.SiteId, 
          Status = p.Status, 
          Gender = g.Name, 
          Title = p.Title, 
          Name = p.Name, 
          City = p.City, 
          Postcode = p.Postcode, 
          Telephone = p.Telephone, 
          Notes = p.Notes 
         }); 

      return View(model); 
     } 

:私は、詳細ページを処理するには、次の方法を持っているontroller私は私が持っているように、私の詳細が表示ストリップダウンしました次:

@model MVCManageParticipants.Models.ParticipantDetailsViewModel 

@{ ViewBag.Title = "Details"; } 

<h2>Details2</h2> 
@Model.Id 
@Model.Gender 

そして私は、次のエラーが表示さ:

辞書に渡されるモデル項目の型は 'System.Data.Entity.Infrastructure.DbQuery`1 [MVCManageParticipants.Models.ParticipantDetailsViewModel]'ですが、この辞書には 'MVCManageParticipants.Models.ParticipantDetailsViewModel'型のモデル項目が必要です。

問題がどのようなものであり、どのように修正するかについて、紛失しました。

+0

あなたのケースの 'model'は、ビューが1つだけのオブジェクトを期待している間に複数のエンティティモデルとして。 'return View(model.FirstOrDefault);'を試してください。 –

+1

小さなメモです。私はEFがあなたが自動的にそれらをやるのを助けるように特別に設計されたときに人が手動でジョインをするのを見ています。あなたの '参加者'に 'public Gender Gender {get; set;}'を単に置くことができます。コンテキストが正しく設定されていれば、それにアクセスするだけでEFがあなたのために参加することができます。だから投影では 'Gender = p.Gender.Name'だけで、参加についてのことはすべて忘れてしまいます。 –

+0

@AlexPavenあなたはこれをさらに詳しく説明するリソースを提供できますか?まだこのメソッドを使用していますが、性別フィールドは空です。 – jonnow

答えて

1

を使用していた

public ActionResult Details([Bind(Prefix = "id")]int participantId = 0) 
{ 
    // Check participant exists 
    Participant participant = _db.Participants.Find(participantId); 

    if (participant == null) 
    { 
     return HttpNotFound(); 
    } 

    var model = (from p in _db.Participants 
        join g in _db.Genders on p.Gender equals g.Id 
        where p.Id == participantId 
        select new ParticipantDetailsViewModel 
        { 
         Id = p.Id, 
         SiteId = p.SiteId, 
         Status = p.Status, 
         Gender = g.Name, 
         Title = p.Title, 
         Name = p.Name, 
         City = p.City, 
         Postcode = p.Postcode, 
         Telephone = p.Telephone, 
         Notes = p.Notes 
        }).FirstOrDefault(); 

    return View(model); 
} 

Where節の結果はコレクションではなく単一のオブジェクトです。結果は1つのオブジェクトを持つコレクションかもしれませんが、それはコレクションであるのに対し、ビューは単一のParticipantDetailsViewModelオブジェクトを必要とし、そのコレクションではありません。FirstOrDefaultは、直前のクエリの結果から最初のオブジェクトを取得するだけです(ビューに必要なものです)

+0

有望ですが、今はこのエラーが発生しています。エンティティまたは複合型 'MVCManageParticipants.Martels.ParticipantDetailsViewModel'をLINQ to Entitiesクエリで構築できません。 – jonnow

+1

ParticipantDetailsViewModelはDbContextの一部ではありません。エンティティではないという意味ですか? – sachin

+0

それだけです。追加されたように見える public System.Data.Entity.DbSet ParticipantDetailsViewModels {get;セット; } – jonnow

1

まず、IQuerybleをビューに渡そうとします。コントローラーで "FirstOrDefault"を呼び出すか、モデルをListに変更してコントローラーで "ToList"を呼び出してみてください。

1

リターンモデルはリストです。

エラーが発生しました。

いつも正しい回答ですが小さな変更です。あなたはこれがあなたの行動がどうあるべきかであるFirstOrDefaultまたはSingleOrDefault

var model = (from p in _db.Participants 
        join g in _db.Genders on p.Gender equals g.Id 
        where p.Id == participantId 
        select new ParticipantDetailsViewModel 
        { 
         Id = p.Id, 
         SiteId = p.SiteId, 
         Status = p.Status, 
         Gender = g.Name, 
         Title = p.Title, 
         Name = p.Name, 
         City = p.City, 
         Postcode = p.Postcode, 
         Telephone = p.Telephone, 
         Notes = p.Notes 
        }).FirstOrDefault(); 
関連する問題