【问题标题】:Not Getting Expected Results in foreach(var item in Model)在 foreach 中没有得到预期的结果(模型中的变量项)
【发布时间】: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&lt;Web_Parkinglot_Header_FullView&gt; 作为其属性之一的东西,还是 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


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多