c# - 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>
解决方案
这是上述问题的解决方案。首先,我获取了 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 的记录。
推荐阅读
- java - 使用 MSI 从本地运行的 java 应用程序连接到 Azure Keyvault 的方法
- python - 使用python在JSON循环中解析文件
- ruby-on-rails - 如何在rails中使用级联删除将列添加为外键
- ruby - 如何在map方法中返回一行两次
- spring-boot - 无法检索远程 JWK 集:login.microsoftonline.com
- c# - 将 HTML 页面作为最后一页添加到 PDF 文档
- mongodb - $在 mongo 数据库中添加值
- asp.net-mvc - 错误:通过 Telerik Web UI 上的错误构建项目
- angular - Angular:无法分配给引用或变量中的错误
- python-3.x - (pandas) 访问索引处特定列的除前 3 行之外的所有行