2016-07-18 10 views
1

私は既存のプログラムをMVC5に変換しています。データベースから複数のテーブルを結合する必要があります。ダミーのプロジェクトプロジェクトを試してみました。私は回復できないほどダメージを与えません。データベースの個々のテーブルをすべて引き出して表示することができました。しかし、私はそれらを結合しようとすると、私は "オブジェクトのインスタンスに設定されていないオブジェクト参照"を取得します。テーブルを結合する、オブジェクト参照を取得しない

注:製品とタスクは既存のモデルとDBのテーブルです。すでに展開されており、変更することはできません。

関連するコントローラコード:

public ActionResult Index() 
    { 
     _db.Configuration.ProxyCreationEnabled = false; 
     var JoinTest = (
      from a in _db.Task.AsEnumerable() 
      join b in _db.Product on a.ProductId equals b.ProductId 
      select new 
      { 
       TaskId = a.TaskId, 
       TaskDesc = a.TaskDescription, 
       ProdDesc = b.ProductDescription 
      }); 
     ViewData["CompositeData"] = JoinTest; 
     ViewData["ProductData"] = _db.Product.ToList(); 
    } 

ビューコード:

@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.ViewModel>) 
    { 
    //Printing relevant items from DB 
    } 

そして、徹底すること、ビューモデルの定義:だから

namespace TomFoolery.Models 
    { 
     public class ViewModel 
     { 
      public Product Product { get; set;} 
      public Task Task { get; set; } 
     } 
    } 

は、私が間違っているつもりです? に設定した項目が匿名タイプのリストであるため、

+0

JoinTest変数(IQueryble <>)がビューに渡されることも問題ではありません。ビューのレンダリング中にその変数にtoList()が呼び出されても、コントローラが配置されているため_dbが配置されている可能性があります。ちょうど、その問題に関連している可能性があることに気づきたい。検証にライフサイクルの掘り下げが必要です。 – x82

答えて

0

ViewData["CompositeData"] as List<TomFoolery.Models.ViewModel>はnullを返します。

ビューモデルを作成して使用する必要があります。

public class MyViewModel 
{ 
    public int TaskId {set;get;} 
    public string TaskDesc {set;get;} 
    public string ProductDesc {set;get;} 
} 

あなたの投影部分で使用してください。

ViewData["CompositeData"] = (
      from a in _db.Task.AsEnumerable() 
      join b in _db.Product on a.ProductId equals b.ProductId 
      select new MyViewModel 
      { 
       TaskId = a.TaskId, 
       TaskDesc = a.TaskDescription, 
       ProdDesc = b.ProductDescription 
      }).ToList(); 

ビューでは、このビューモデルコレクションにキャストする必要があります。

@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.MyViewModel>) 
{ 
    <p>@item.TaskId</p> 
} 

また、ViewDataの使用を排除し、完全に厳密に型指定されたビューモデルのアプローチを検討することもできます。代わりにViewDataをに設定するので、その

public class MyPageViewModel 
{ 
    public List<MyViewModel> Tasks {set;get;} 
    public List<Product> Products {set;get;} 
} 

とあなたのGETアクションでは、ご使用のビューのためのビューモデルを作成し、このビューモデルのオブジェクトを作成し、プロパティ

var vm = new MyPageViewModel(); 
vm.Products = _db.Product.ToList(); 
vm.Tasks = (
       from a in _db.Task.AsEnumerable() 
       join b in _db.Product on a.ProductId equals b.ProductId 
       select new MyViewModel 
       { 
        TaskId = a.TaskId, 
        TaskDesc = a.TaskDescription, 
        ProdDesc = b.ProductDescription 
       }).ToList(); 
return View(vm); 

とで対応だに設定強く私たちの新しいビューモデルに入力され、あなたのビュー

@model MyPageViewModel 
@foreach(var item in Model.Tasks) 
{ 
    <p>@item.TaskId</p 
    <p>@item.TaskDesc</p> 
    <p>@item.ProdDesc</p> 
} 
+1

ありがとうございました。魅力のように動作します。 – UIDAlexD

0
ViewData["CompositeData"] = JoinTest; 

JoinTestIEnumerable<anonymous_type>であるため、List<TomFoolery.Models.ViewModel>にキャストすることはできません。

var JoinTest = (
     from a in _db.Task.AsEnumerable() 
     join b in _db.Product on a.ProductId equals b.ProductId 
     select new TomFoolery.Models.ViewModel /* changed */ 
     { 
      TaskId = a.TaskId, 
      TaskDesc = a.TaskDescription, 
      ProdDesc = b.ProductDescription 
     }); 
    ViewData["CompositeData"] = JoinTest.ToList(); /*changed */ 
+0

申し訳ありませんが、私は間違って編集しました! – Shyju

+0

モデルを編集する必要がありますか、モデルを編集する必要はありませんか? – UIDAlexD

+0

'ViewModel'の定義は匿名型と同じかどうかによって異なります。そうであれば、うまくいくはずです。それ以外の場合は、Shyjuの答えに従ってください。 – Xiaoy312

関連する問題