2017-10-14 14 views
0

2つの別々のViewDatas( "R_Outout"と "M_Output")で2つの異なるSQL検索のデータがあります。それぞれにRoom_idという列があります。異なるビューデータの結果と一致する方法

私がビューで実行したいのは、これらの値を照会し、一致する場合は別の列の対応する結果を表示することです。現時点で

、私は(ストレートViewDataをM-出力から)この出力を得る

Room ID Date from Date to repair ID notes 
    5  05/01/2017 06/01/2017 5 
    20  01/11/2016 15/11/2016 5 
    14  27/10/2016 15/11/2016 3 

など

私は何を取得しようとしていることで部屋番号から対応する部屋番号であります2番目のビューデータ出力(r_output)。

Room  Date from Date to repair ID notes 
101  05/01/2017 06/01/2017 5 
220  01/11/2016 15/11/2016 5 
    45  27/10/2016 15/11/2016 3 

アイブ氏は、私が出ることは奇数部屋番号の代わりにidを持つ、テーブルの複数のコピーである。この

@foreach (var item in ViewData["M_Output"] as IEnumerable<app.Models.SP_RESULTS.MT>) 
{ 
    <tr> 
     @foreach (var inneritem in ViewData["R_Output"] as IEnumerable<app.Models.SP_RESULTS.rm>) 
      { 
      <td> 
       @if (inneritem.room_id == item.room_id) 
      { 
        @inneritem.room_no 
       } 
      </td> 
      <td> 
       @item.date_from.ToString("dd/MM/yyyy") 
      </td> 
      <td> 
       @item.date_to.ToString("dd/MM/yyyy") 
      </td> 
etc... 
      } 
    </tr> 
} 

を試してみました。 私は自分のForeachとIfを間違った場所に持っているかもしれないと理解していますが、どこにあるべきかを理解するのに問題があります。

誰かが私を助けることができますか?

UPDATE:だから、代わりにこの enter image description here

の私は、あなたがM_Outputコレクションからすべての行を印刷するように、この

enter image description here

+0

を通して、あなたのアクションメソッド

var result = (from m in mtSet join r in rmSet on m.room_id equals r.room_id into gj from s in gj.DefaultIfEmpty() select new RoomVm { RoomId = p.room_id, FromDate=p.date_from, RoomNo= s?.room_no ?? null} ).ToList(); return View(result); 

とビューで、ちょうどループで今、この

public class RoomVm { public int RoomId { set;get;} public DateTime FromDate { set;get;} public int? RoomNo { set;get;} } 

のようなビューモデルを持っていると仮定すると

(部屋のID値に基づいて)両方のセットから?具体的に期待される出力は? – Shyju

+0

こんにちは@Shyjuなので、M_output.Room_id = r_Output.room_idの場合は、最初のにr_output.Room_noを表示し、その行の残りのデータをM_Outputに出力します。 M_Outputの次の行の次のパスで同じことをしてください... m_outputの行が終了しました –

答えて

1

が見える取得し、一致するレコードはR_Outoutコレクションに存在する場合それからRoomNo値を出力したいとします。

これを行うには、LINQ左結合式を使用できます。上記のLINQ LEFTで

@{ 
    var mtSet= ViewData["M_Output"] as IEnumerable<app.Models.SP_RESULTS.MT>;   

    var rmSet = ViewData["R_Output"] as IEnumerable<app.Models.SP_RESULTS.rm>; 

    var result = (from m in mtSet 
        join r in rmSet on m.room_id equals r.room_id into gj 
        from s in gj.DefaultIfEmpty()  
        select new { RoomId = p.room_id, 
           FromDate=p.date_from, 
           RoomNo= s?.room_no ?? null}).ToList(); 

} 

<table class="table"> 
    @foreach (var item in result) 
    { 
     <tr> 
      <td>@item.RoomId </td> 
      <td>@item.FromDate.ToString()</td> 
      <td>@item.RoomNo</td>  
     </tr> 
    } 
</table> 

発現に参加する、私はRoomIdRoomNoFromDateプロパティを持つ匿名オブジェクトに結果を投影しています。その構造を持ち、それを投影するビューモデルを作成することができます。

私は自分の意見に多くのC#コードを入れたいとは思わない。私は私の意見をもっとHTMLyに保ち、私のC#コードを最小限に保つのが好きです。私は、アクションメソッドの中にジョインコードを置き、希望の結果だけをビューに渡します。私は必要なプロパティ(上記の段落で述べた)を持つビューモデルを作成し、そのビューモデルのリストをlinq式から作成し、ビューモデルを使用する代わりにそのビューに渡します。あなたはあなたが共通たいモデル

@model List<RoomVm> 
<table class="table"> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td>@item.RoomId </td> 
      <td>@item.FromDate.ToString()</td> 
      <td>@item.RoomNo</td>  
     </tr> 
    } 
</table> 
+0

こんにちは、次の行にエラーが表示されます: 'm.room_idのrmSetのjoin rはgjのr.room_idと同じです' - VSはroom_idのままです(両方)がViewdataに存在しません。 、 '@foreach(結果内のvar item)' - foreach文は動作できません。 –

+0

ViewDataアイテムをList 'と' 'のリストにキャストしましたか? 'mtSet'と' rsSet'のタイプはそれらのエンティティのリストでなければなりません。これは、ビューのコードの最初の2行でやっていることです。 – Shyju

+0

こんにちは、はい。上記のコードを手紙に従った。エラーは "IEnumerable には" room_id "の定義はなく、タイプ" IEnumerable の最初の引数を受け入れる拡張メソッド "room_id"は見つかりませんでした。 –

関連する問題