2016-05-17 3 views
0

POアイテム(この部分を含む)を含むPOリクエストの結果テーブルを表示し、表示されるすべてのアイテムの検索機能を提供する必要があります私が大部分を理解した部分)。MVC 5 EF 6 - 関連テーブルオブジェクト基準を使用してテーブルを検索する方法

私は必要なデータを表示することができますが、PORequestsモデルのデータであれば、私が必要とするほとんどすべてを検索することができます。 「親モデル」)。 "子モデル" POItemsを使用して検索しようとすると、実際のオブジェクト(ID、説明など)にアクセスできません。これは、DatabaseFirstモデルとEF6.x DbContextGeneratorを使用して構築されました。 ItemDescriptionで

//POItemData ViewModel 
using FinanceSearch.Models; 
namespace FinanceSearch.ViewModels 
{ 
    public class POItemData 
    { 
     public PagedList.IPagedList<PORequest> PORequests { get; set; } 
     public PagedList.IPagedList<POItem> POItems { get; set; } 
    } 
} 

//POItems Model 
namespace FinanceSearch.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class POItem 
    { 
     public int ID { get; set; } 
     public int Amount { get; set; } 
     public string Description { get; set; } 

     public virtual PORequest PORequest { get; set; } 
    } 
} 

//PORequest Model 
namespace FinanceSearch.Models 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 

    public partial class PORequest 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public PORequest() 
     { 
      this.POAttachments = new HashSet<POAttachment>(); 
      this.POItems = new HashSet<POItem>(); 
     } 

     //other relevant stuff 

     public virtual ICollection<POItem> POItems { get; set; } 

    } 
} 


//Controller 
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Net; 
using System.Web; 
using System.Web.Mvc; 
using FinanceSearch.Models; 
using PagedList; 
using System.Web.UI.WebControls; 
using System.Data.Entity.SqlServer; 
using FinanceSearch.ViewModels; 

namespace FinanceSearch.Controllers 
{ 
    public class PORequestsController : Controller 
    { 
     private Finance db = new Finance(); 



     public ActionResult Index(int? id, int? page, string sortOrder, string currentFilter, string poNumber, 
      string AppropNumber, string ContractNumber, string ItemDescription) 
     { 

      ViewBag.CurrentSort = sortOrder; 
      ViewBag.POSortParm = String.IsNullOrEmpty(sortOrder) ? "PONumber_desc" : ""; 
      ViewBag.AppropNumberSortParm = sortOrder == "AppropNumber" ? "AppropNumber_desc" : "AppropNumber"; 
      ViewBag.ContractNumberSortParm = sortOrder == "ContractNumber" ? "ContractNumber_desc" : "ContractNumber"; 


      if (poNumber != null) 
      { 
       page = 1; 
      } 
      else 
      { 
       ponumber = currentFilter; 
      } 

      //int pageSize = 3; 
      int pageNumber = (page ?? 1); 

      var viewModel = new POItemData(); 

      viewModel.PORequests = db.PORequests 
       .Include(i => i.POItems) 
       .OrderBy(i => i.ID).ToPagedList(pageNumber, 5); 

      if (!String.IsNullOrEmpty(poNumber)) 
      { 
       viewModel.PORequests = viewModel.PORequests.Where(s => s.PONumber.Contains(ponumber)).ToPagedList(pageNumber, 5); 
      } 
      if (!string.IsNullOrEmpty(AppropNumber)) 
      { 
       viewModel.PORequests = viewModel.PORequests.Where(x => x.AppropNumber.Contains(AppropNumber)).ToPagedList(pageNumber, 5); 
      } 
      if (!string.IsNullOrEmpty(ContractNumber)) 
      { 
       viewModel.PORequests = viewModel.PORequests.Where(x => x.ContractNumber.Contains(ContractNumber)).ToPagedList(pageNumber, 5); 
      } 
      if (!string.IsNullOrEmpty(ItemDescription)) 
      { 

      } 

文の場合、次のようなものがいいだろう:

if (!string.IsNullOrEmpty(ItemDescription)) 
{ 
viewModel.PORequests = viewModel.PORequests.Where(x => x.POItems.Description.Contains(ItemDescription)).ToPagedList(pageNumber, 5); 
} 

x.POItems.Description部分は、この意味では存在しません。それは明らかにそれがリストであることに関係しています。私が遭遇したチュートリアルと回答で、どのようにすべての違いを作るために表示されますので、コードの残りの部分を継続...上記のコードで

  switch (sortOrder) 
      { 
       case "PONumber_desc": 
        viewModel.PORequests = viewModel.PORequests.OrderByDescending(s => s.PONumber).ToPagedList(pageNumber, 5); 
        break; 
       case "AppropNumber": 
        viewModel.PORequests = viewModel.PORequests.OrderBy(s => s.AppropNumber).ToPagedList(pageNumber, 5); 
        break; 
       case "AppropNumber_desc": 
        viewModel.PORequests = viewModel.PORequests.OrderByDescending(s => s.AppropNumber).ToPagedList(pageNumber, 5); 
        break; 
       case "ContractNumber": 
        viewModel.PORequests = viewModel.PORequests.OrderBy(s => s.ContractNumber).ToPagedList(pageNumber, 5); 
        break; 
       case "ContractNumber_desc": 
        viewModel.PORequests = viewModel.PORequests.OrderByDescending(s => s.ContractNumber).ToPagedList(pageNumber, 5); 
        break; 
       default: 
        viewModel.PORequests = viewModel.PORequests.OrderBy(s => s.PONumber).ToPagedList(pageNumber, 5); 
        break; 
      } 


      return View(viewModel); 
     } 

、私は、私のページングを含め、同様のものをソートこのプロジェクトには必要です。以下は

私は結果を表示するために使用していますインデックス/ビューです:私は、変数ItemDescriptionの使用方法を理解していないようです

を:要約すると

//View (Index)  
@model FinanceSearch.ViewModels.POItemData 
@using PagedList.Mvc; 
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" /> 

@{ 
    ViewBag.Title = "PORequests"; 
} 

<h2>Finance</h2> 

@*<p> 
    @Html.ActionLink("Create New", "Create") 
</p>*@ 

<p> 
    <button class="btn btn-default" data-toggle="collapse" href="#MainFilter" @*data-target="#MainFilter"*@ aria-multiselectable="true" aria-expanded="true">Filter By...</button> 
</p> 

@*<div id="accordion" role="tablist" aria-multiselectable="true">*@ 
@using (Html.BeginForm("Index", "PORequests", FormMethod.Get)) 
{ 
    <div id="MainFilter" class="collapse"> 

     <table class="table-responsive"> 
      <tr> 
       <td> 
        Item: 
       </td> 
       <td> 
        @Html.TextBox("ItemDescription", ViewBag.CurrentFilter as string) //this is where the user would search items using a string 
       </td> 
      </tr> 
      <tr> 
       <td> 
        PO #: 
       </td> 
       <td> 
        @Html.TextBox("PONumber", ViewBag.CurrentFilter as string) 
       </td> 
      </tr> 
     </table> 
     <br /> 
     <p> 
      <button class="btn btn-primary btn-sm" data-parent="#MainFilter" data-toggle="collapse" href="#SubFilterPOInfo" @*data-target="#SubFilterPOInfo"*@>Filter by PO Info...</button> 
     </p> 

     <div id="SubFilterPOInfo" class="collapse"> 
      <table class="table-responsive"> 
       <tr> 
        <td> 
         AppropNumber: 
        </td> 
        <td> 
         @Html.TextBox("AppropNumber", ViewBag.CurrentFilter as string) 
        </td> 
       </tr> 
       <tr> 
        <td> 
         Contract Number: 
        </td> 
        <td> 
         @Html.TextBox("ContractNumber", ViewBag.CurrentFilter as string) 
        </td> 
       </tr> 
      </table> 
     </div> 

} 

<div style="overflow-x: scroll"> 

    <table class="table" style="white-space:nowrap"> 

     <tr> 
      <th></th> 
      <th></th> 
      <th> 
       @Html.ActionLink("PONumber", "Index", new { sortOrder = ViewBag.POSortParm, currentFilter = ViewBag.CurrentFilter }) 
      </th> 
      <th> 
       @Html.ActionLink("AppropNumber", "Index", new { sortOrder = ViewBag.AppropNumberSortParm, currentFilter = ViewBag.CurrentFilter }) 
      </th> 
      <th> 
       @Html.ActionLink("ContractNumber", "Index", new { sortOrder = ViewBag.ContractNumberSortParm, currentFilter = ViewBag.CurrentFilter }) 
      </th> 
     </tr> 

     @foreach (var item in Model.PORequests) 
      { 
      <tr> 
       <td> 
        @*@Html.ActionLink("Edit", "Edit", new { id = item.ID }) |*@ 
        @Html.ActionLink("Details", "Details", new { id = item.ID }) | 
        @*@Html.ActionLink("Delete", "Delete", new { id = item.ID })*@ 
       </td> 
       <td> 
        //I am able to list the related items in the PORequests table 
        @foreach (var poitem in item.POItems) 
        { 
         @poitem.Description<br /> 
        } 

       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.PONumber) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.AppropNumber) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.ContractNumber) 
       </td> 

      </tr> 

     } 
    </table> 

</div> 
<br /> 
//paging and sorting stuff 
    Page @(Model.PORequests.PageCount < Model.PORequests.PageNumber ? 0 : Model.PORequests.PageNumber) of @Model.PORequests.PageCount 
    @Html.PagedListPager(Model.PORequests, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter })) 

をPOItemsリスト内で検索し、関連オブジェクトとしてPOItemテーブルを含むPORequestテーブルを取得して結果を表示します。私の他の検索はすべて期待通りに機能します。

私は特にこのサイトで検索しましたが、同様の質問のいずれかは、リスト内の各項目を表示するだけで、私ができること、または機能の作成/編集、 、彼らは解決策ではないように見えるところでMVCを十分理解していません。ここ

は、いくつかのそのような例である:

MVC Code First: One-to-many relationship between own model and SimpleMembership user

EntityFramework 6. How to get related objects?

https://stackoverflow.com/questions/26372533/add-the-list-of-object-to-parent-object-using-mvc-5-and-ef-6

任意の助けを理解大幅あろう。検索式内の項目へのダウン

+0

あなたのような内部の任意のクエリを使用する必要がありますi => i.Description.Contains(ItemDescription)))。ToPagedList(pageNumber、5); –

+0

@ t.enixおっと、私はあなたのコメントに気付かなかった。私は答えとして自由に追加してください。私は私を削除します。 –

答えて

1

ドリル:( viewModel.PORequests = viewModel.PORequests.Where(X => x.POItems.Any:

if (!string.IsNullOrEmpty(ItemDescription)) 
{ 
    viewModel.PORequests = viewModel.PORequests.Where(x => x.POItems 
     .Any(i => i.Description.Contains(ItemDescription))) 
     .ToPagedList(pageNumber, 5); 
} 
関連する問題