首页 > 解决方案 > C# MVC 视图模型使用连接表返回 IEnumerable 列表

问题描述

当我处理我的项目并从每一步中学习时,我仍然会卡在某些部分上。我有 3 个表 SubJobs、MaterialRequired 和 Parts。所需材料实际上只是一个参考表。在我看来,我需要生成的是 SubJob 详细信息,然后是零件列表。所以一个 Subjob 有很多部分,我想保持 Parts 表干净,而不必在 Parts 表中添加重复数据。例如,编号为 102311 的子作业可能具有零件编号 Ef3012,而另一个子作业可能具有相同的零件。所以我不想在表中使用不同的 SubJobs 有 5 次相同的零件编号。所以我制作了一个 MaterialRequired 表,其中包含 SubJob 编号和 PartNumber 都是其他表的键。我正在为页面提供一个 SubJob 编号并在 ViewModel 中显示数据。该页面加载了 SubJob 详细信息,但我在显示这些部分时遇到了问题。在下面的代码中,result.RequiredDetail 按应有的方式从 MaterialsRequired 生成一个零件编号列表。我只是使用这段代码来了解它是如何工作的。当前形式的 result.PartsDetail 只为该子作业生成 1 条记录,而不是全部。模型本身是否缺少某些东西,或者是否有另一种方法可以得到我需要的列表?

这是我的视图模型:

    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>

标签: c#linqmodel-view-controller

解决方案


这是上述问题的解决方案。首先,我获取了 MaterialsRequired 和 Parts 并制作了一个 SQL 视图。创建了一个名为 PartsView “也是 SQL 视图的名称”的模型,此时我只需要进行 1 个连接,但我确实添加了另一个连接,以便将按钮链接返回到顶级作业“MachineDetail”页面。

这是视图模型:

    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; }
}

控制器动作保持不变。razor 页面保持不变,只是在 foreach 中添加了一个“if”语句以仅显示 IsViewable = true 的记录。


推荐阅读