【发布时间】:2022-06-13 21:40:32
【问题描述】:
我有一个 MVC5/C# 索引视图,它将显示停车场的所有员工注册车辆。
foreach (var item in Model)
{
<table class="table">
<tr>
<td>
<b>Vehicle Make:</b> @Html.DisplayFor(modelItem => item.veh_make)
</td>
<td>
<b>Model:</b> @Html.DisplayFor(modelItem => item.veh_model)
</td>
</tr>
</table>
}
模型基于连接两个 SQL 表的视图。标题(表 1)和车辆(表 2)。
SQL 视图是一个左外连接,在 Vehicle Table (Many) 中创建用户名/标题 (1) 到与该用户关联的所有车辆的结果。
我在车辆表中有两辆车。当我打开 SQL 视图 Where logon_id = {my id} 时,它在结果中显示了两条记录。我看到我的宝马和斯巴鲁。所以,我相信我的 SQL Join 是正确的?
但是,当我从控制器复制此内容时,我的 MVC 索引视图上没有得到预期的结果(2 种不同的车辆)。相反,我看到同一辆车列出了两次。
我正在通过我的控制器点击视图:
public ActionResult Index(string id)
{
string MyName = System.Web.HttpContext.Current.User.Identity.Name;
id = ParseMe.ParseLogin(MyName);
Web_Parkinglot_Header_FullViewRepository oItem = new Web_Parkinglot_Header_FullViewRepository();
var item = oItem.GetbyLogon((string)id);
}
还有 GetByLogon
public List<Web_Parkinglot_Header_FullView> GetbyLogon(string id)
{
return this.Context.Web_Parkinglot_Header_FullViews.Where(a => a.logon_id == id).ToList();
}
添加我的 SQL 连接,以防我在这里遗漏一些东西:
SELECT dbo.Header.last_name, dbo.Header.logon_id, dbo.Vehicles.veh_make, dbo.Vehicles.veh_model
FROM dbo.Header LEFT OUTER JOIN
dbo.Vehicles ON dbo.Header.logon_id = dbo.Vehicles.logon_id
当我在 SQL Server Mgmt Studio 中手动运行它时(其中 logon_id = my Id),我看到两行包含我的两辆汽车。
通过我的模型代码运行它,我得到了两次相同的车辆。
我在故障排除中迷失的地方是我的 SQL VIEW 带回了两个车辆 where logon_id = my id。那么,为什么我的 GetByLogon 将同一辆车带回两次,而不是两辆不同的车辆。我的代码中有什么不明白的地方?
分辨率:
return this.Context.Web_Parkinglot_Header_FullViews.AsNoTracking().Where(a => a.logon_id == id).ToList();
感谢 TopdSail 用引用 AsNoTracking() 的链接引导我朝着正确的方向前进。
这是我的问题的解决方案,我现在看到了预期的结果。真相:虽然它有效,但我并不完全理解 AsNoTracking(),所以我仍然需要做一些研究。
【问题讨论】:
-
我有点模糊,但也许你不想 foreach 项目,而是项目中的项目。也就是说 - item 是一个列表。您想要列表中的项目。但不确定 - 当您提供一个应该有两辆车的 id 时,GetByLogon() 的实际返回值是多少?
-
为了更清楚地说明这一点,也许我应该问一下 Model 是具有
List<Web_Parkinglot_Header_FullView>作为其属性之一的东西,还是 model 实际上只是Web_Parkinglot_Header_FullView?但是是的,在后一种情况下不需要 foreach,在前一种情况下似乎没有迭代正确的事情。 -
如果您不调用 DisplayFor,而是输出
@item.veh_make,会发生什么情况?另外,您能否显示从您在操作中初始化item到将其传递到视图的代码? -
@topsail - 我停止调试以查看该项目,令我惊讶的是,它带回了 2 个重复的行而不是两个唯一的行。这让我很困惑,因为 SQL 视图并没有这样做。另外,我在模型中使用 List(Web_Parkinglot_Header_FullView>。
-
@StriplingWarrior - 当我删除 Display For 并仅输出 (@item.veh_make) 时,我看到了同样的问题。重复品牌(Escalade x 2 而不是 1. Escalade 2. BMW)。
标签: c# sql-server asp.net-mvc-5