C # MVC View Model возвращает IEnumerable список с использованием таблицы соединений - PullRequest
0 голосов
/ 21 ноября 2018

Когда я работаю над своим проектом и учусь на каждом этапе, я все еще застреваю в некоторых частях.У меня есть 3 таблицы SubJobs, MaterialRequired и Parts.Требуемый материал действительно только справочная таблица.На мой взгляд, мне нужно произвести SubJob Detail, а затем список деталей.Итак, у Subjob есть много частей, и я хотел, чтобы таблица частей была чистой, без необходимости добавлять дубликаты данных в таблицу частей.Например, подзадача с номером 102311 может иметь номер детали Ef3012, а другая подзадача может иметь такую ​​же часть.Поэтому я не хочу, чтобы один и тот же номер детали 5 раз находился в таблице с разными вспомогательными заданиями.Поэтому я создал таблицу MaterialRequired, которая содержит номер SubJob и PartNumber, которые являются ключами для других таблиц.Я кормлю страницу номером SubJob и отображаю данные в ViewModel.Страница загружается с деталями SubJob, но у меня возникают проблемы с отображением частей.В приведенном ниже коде result.RequiredDetail создает список partNumbers из MaterialsRequired, как и должно быть.Я только использую этот код, чтобы узнать, как он работает.Result.PartsDetail в его текущей форме выдает только 1 запись вместо всех для этой подзадачи.Есть ли что-то, чего мне не хватает в самой модели или есть другой способ получить результат, чтобы получить нужный мне список?

Вот мой ViewModel:

    public partial class SubJobDetails
{
    public static SubJobDetails GetSubjobsAndParts(string mReq, CustomerEntities db)
    {
        var Parts = from pts in db.Parts
                   join mr in db.MaterialRequired on pts.PartNumber equals mr.Material
                   join sj in db.SubJobs on mr.SubJob equals sj.JobNumber
                   where (mr.SubJob == mReq)
                   select new SubJobDetails()
                   {
                       Parts = pts,
                       Material = mr,
                       SubJobs = sj
                   };

        var result = Parts.FirstOrDefault();

        if (result != null)
        {
            result.RequiredDetail = db.MaterialRequired.Where(a => a.SubJob == result.SubJobs.JobNumber);
            result.PartsDetail = db.Parts.Where(a => a.PartNumber == result.Material.Material);
        };

        return result;
    }

    public virtual Parts Parts { get; set; }
    public virtual SubJobs SubJobs { get; set; }
    public virtual MaterialRequired Material { get; set; }
    public virtual IEnumerable<Parts> PartsDetail { get; set; }
    public virtual IEnumerable<MaterialRequired> RequiredDetail { get; set; }

Это контроллер(Я считаю, что это работает, как ожидалось):

        public ActionResult PartsDetail(string mReq)
    {
        if (mReq == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        SubJobDetails modelInstance = SubJobDetails.GetSubjobsAndParts(mReq, db);
        //if (modelInstance == null)
        //{
        //    return HttpNotFound();
        //}
        return View(modelInstance);

Вот моя страница просмотра:

@model BestenEquipment.Models.SubJobDetails
@{
   ViewBag.Title = "PartsDetail";
   Layout = "~/Views/Shared/CustomerDashboardLayout.cshtml";
}

<div id="page-wrapper">
<div class="row">
    <div class="col-lg-12">
        <div>
            <h4>Sub Job</h4>
            <hr />
            <dl class="dl-horizontal">

                <dt>
                    @Html.DisplayNameFor(model => model.SubJobs.Description)
                </dt>

                <dd>
                    @Html.DisplayFor(model => model.SubJobs.Description)
                </dd>

                <dt>
                    @Html.DisplayNameFor(model => model.SubJobs.ExtDescription)
                </dt>

                <dd>
                    @Html.DisplayFor(model => model.SubJobs.ExtDescription)
                </dd>

                <dt>
                    @Html.DisplayNameFor(model => model.SubJobs.PartNumber)
                </dt>

                <dd>
                    @Html.DisplayFor(model => model.SubJobs.PartNumber)
                </dd>

                <dt>
                    @Html.DisplayNameFor(model => model.SubJobs.Drawing)
                </dt>

                <dd>
                    @Html.DisplayFor(model => model.SubJobs.Drawing)
                </dd>
            </dl>
        </div>

        <div class="row">
            <div class="col-lg-12">
                <div>
                    <h4>Parts</h4>
                    <table class="table">
                        <tr>
                            <th>
                                @Html.DisplayNameFor(model => model.Parts.PartNumber)
                            </th>
                            <th>
                                @Html.DisplayNameFor(model => model.Parts.Description)
                            </th>

                            <th>
                                @Html.DisplayNameFor(model => model.Parts.ExtDescription)
                            </th>

                            <th>
                                @Html.DisplayNameFor(model => model.Parts.DrawingNumber)
                            </th>
                        </tr>
                        @foreach (var item in Model.PartsDetail)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(model => item.PartNumber)
                                </td>

                                <td>
                                    @Html.DisplayFor(model => item.Description)
                                </td>

                                <td>
                                    @Html.DisplayFor(model => item.ExtDescription)
                                </td>

                                <td>
                                    @Html.DisplayFor(model => item.DrawingNumber)
                                </td>
                                <td></td>
                            </tr>
                        }
                    </table>
                </div>
            </div>
        </div>
    </div>
    <!-- /.col-lg-12 -->
</div>
</div>

1 Ответ

0 голосов
/ 23 ноября 2018

Вот решение проблемы выше.Сначала я взял материалы, необходимые и детали и сделал вид SQL.создал модель с именем PartsView «Также имя SQL-представления». Мне нужно было сделать только 1 соединение на этом этапе, но я добавил еще одно соединение, чтобы дать мне ссылку на страницу задания «MachineDetail» верхнего уровня.

Вот ViewModel:

    public partial class SubJobDetails
{
    public static SubJobDetails GetSubjobsAndParts(string mReq, CustomerEntities db)
    {

        var Parts = from pts in db.PartsView
                    join sj in db.SubJobs on pts.SubJob equals sj.SubJob
                    join tlj in db.TopLvlJobs on sj.TopLvlJob equals tlj.TopLvlJob
                    where (pts.SubJob == mReq)
                   select new SubJobDetails()
                   {
                       PartsView = pts,
                       TopLvlJob = tlj.TopLvlJob,
                       SubJobs = sj,

                   };

        var result = Parts.FirstOrDefault();

        if (result != null)
        {
            result.PartsDetail = db.PartsView.Where(a => a.SubJob == result.PartsView.SubJob);
        };

        return result;
    }
    public string TopLvlJob { get; set; }
    public virtual TopLvlJobs TopLvlJobs { get; set; }
    public virtual PartsView PartsView { get; set; }
    public virtual SubJobs SubJobs { get; set; }
    public virtual IEnumerable<PartsView> PartsDetail { get; set; }
}

Действие контроллера не изменилось.Страница бритвы осталась прежней, добавив только оператор if в foreach, чтобы показывать только записи, где IsViewable = true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...