C#MVC视图模型使用联接表返回IEnumerable列表



当我在项目中工作并从每一步中学习时,我仍然会遇到一些问题。我有三张表SubJobs、MaterialRequired和Parts。所需材料实际上只是一个参考表。在我的视图中,我需要生成的是子作业详细信息,然后是零件列表。因此,子作业有许多部件,我想保持部件表的清洁,而不必在部件表中添加重复的数据。例如,编号为102311的子作业可以具有部件编号Ef3012,并且另一个子作业可以具有相同的部件。所以我不想用不同的SubJobs在表中有5次相同的零件号。因此,我制作了一个MaterialRequired表,其中包含SubJob编号和PartNumber,它们都是其他表的键。我正在给页面提供一个SubJob编号,并在ViewModel中显示数据。页面加载了SubJob详细信息,但我在显示部件时遇到问题。在下面的代码结果中。RequiredDetail根据需要从MaterialsRequired中生成一个零件编号列表。我只是使用这个代码来了解它是如何工作的。结果。当前形式的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>

以下是上述问题的解决方案。首先,我获取了MaterialsRequired和Parts,并制作了一个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; }
}

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

最新更新