ASP.NET MVC 5 / C# Foreach 循环 - 重复相同的数据
ASP.NET MVC 5 / C# Foreach loop - repeats same data
这看起来很漂亮 'beginner' 但我很挣扎。
我有一个连接两个 table(Employee
和 Cars
)的 SQL 服务器视图。我有那个视图的模型。
当我打开 SQL Server Management Studio 并使用匹配员工 A 的 Select *
条记录查询 SQL 服务器视图时。我得到两条记录,因为该员工只列出一次在 Employee
table 中,在 Cars
table 中两次。在 SQL Server Management Studio 中,我验证了上述人员的两个 Cars
是唯一的。应该是这样。
但我一定是在我的代码中做错了,在 ASP.NET MVC 5 应用程序中,因为当我加载 Index
视图时,它应该显示两个唯一的记录 - 它反而显示我两次完全相同的记录(同一辆车)。
在我的控制器中:
public ActionResult Index()
{
string MyName =
System.Security.Principal.WindowsIdentity.GetCurrent().Name;
String result = MyName.Substring(MyName.Length - 6);
ViewBag.WhoAmI = result;
UserPrincipal userPrincipal = UserPrincipal.Current;
String name = userPrincipal.DisplayName;
ViewBag.MyRealID = name;
try
{
Web_Parkinglot_Header_FullViewRepository oItem = new
Web_Parkinglot_Header_FullViewRepository();
Var item = oItem.GetbyLogon((string)result);
if (!String.IsNullOrEmpty(result))
{
}
return View(item.ToList());
}
catch (Exception ex)
{
throw ex;
}
}
存储库:
public List<Web_Parkinglot_Header_FullView> GetbyLogon(string result)
{
return this.Context.Web_Parkinglot_Header_FullViews.Where(a => a.logon_id == result).ToList();
}
查看:
foreach (var item in Model)
{
<table class="table">
<tr>
<td>
<img src="~/Content/images/bmw.png" width="75" height="50" />
</td>
<td>
<b>Vehicle Make:</b> @Html.DisplayFor(modelItem => item.veh_make)
</td>
<td>
<b>Model:</b> @Html.DisplayFor(modelItem => item.veh_model)
</td>
<td>
<b>Color:</b> @Html.DisplayFor(modelItem => item.veh_color)
</td>
<td>
<b>Plate:</b> @Html.DisplayFor(modelItem => item.veh_plate)
</td>
</tr>
</table>
}
我不明白的是:为什么,当我直接查询 SQL 服务器视图时,我得到 logon_id = A 的正确 2 辆车。但是当我 运行 通过存储库进行相同的查询,我得到 2 条记录,但在 foreach 循环中它是相同的记录两次。
SQL 服务器视图是内部联接。我还可以 post 更多信息(型号等,如果需要的话)
在 Entity Framework.
中使用 views 时存在一个微妙的问题
如果您有 table,请将其与 EF 一起使用,您需要有一个 主键 来唯一标识每一行。通常,这是一个单独的列,例如ID
或类似的东西。
对于视图,您没有“主键”的概念 - 视图仅包含一些 table 中的一些列。
因此,当 EF 映射视图时,它找不到主键 - 因此,它将使用视图中的 所有 non-nullable 列 作为“替代”主键关键。
我不知道你的情况是什么 - 你应该可以从 .edmx
模型中分辨出来。
所以问题真的是你不能在视图上有明确的主键。
最简单的解决方案是 include 来自视图定义中涉及的 table 的主键(即使您不想显示它们曾经)。
那样的话,这些就会出现在视图中,并且它们会是 non-nullable,因此您应该没问题,不会得到任何重复项。
这看起来很漂亮 'beginner' 但我很挣扎。
我有一个连接两个 table(Employee
和 Cars
)的 SQL 服务器视图。我有那个视图的模型。
当我打开 SQL Server Management Studio 并使用匹配员工 A 的 Select *
条记录查询 SQL 服务器视图时。我得到两条记录,因为该员工只列出一次在 Employee
table 中,在 Cars
table 中两次。在 SQL Server Management Studio 中,我验证了上述人员的两个 Cars
是唯一的。应该是这样。
但我一定是在我的代码中做错了,在 ASP.NET MVC 5 应用程序中,因为当我加载 Index
视图时,它应该显示两个唯一的记录 - 它反而显示我两次完全相同的记录(同一辆车)。
在我的控制器中:
public ActionResult Index()
{
string MyName =
System.Security.Principal.WindowsIdentity.GetCurrent().Name;
String result = MyName.Substring(MyName.Length - 6);
ViewBag.WhoAmI = result;
UserPrincipal userPrincipal = UserPrincipal.Current;
String name = userPrincipal.DisplayName;
ViewBag.MyRealID = name;
try
{
Web_Parkinglot_Header_FullViewRepository oItem = new
Web_Parkinglot_Header_FullViewRepository();
Var item = oItem.GetbyLogon((string)result);
if (!String.IsNullOrEmpty(result))
{
}
return View(item.ToList());
}
catch (Exception ex)
{
throw ex;
}
}
存储库:
public List<Web_Parkinglot_Header_FullView> GetbyLogon(string result)
{
return this.Context.Web_Parkinglot_Header_FullViews.Where(a => a.logon_id == result).ToList();
}
查看:
foreach (var item in Model)
{
<table class="table">
<tr>
<td>
<img src="~/Content/images/bmw.png" width="75" height="50" />
</td>
<td>
<b>Vehicle Make:</b> @Html.DisplayFor(modelItem => item.veh_make)
</td>
<td>
<b>Model:</b> @Html.DisplayFor(modelItem => item.veh_model)
</td>
<td>
<b>Color:</b> @Html.DisplayFor(modelItem => item.veh_color)
</td>
<td>
<b>Plate:</b> @Html.DisplayFor(modelItem => item.veh_plate)
</td>
</tr>
</table>
}
我不明白的是:为什么,当我直接查询 SQL 服务器视图时,我得到 logon_id = A 的正确 2 辆车。但是当我 运行 通过存储库进行相同的查询,我得到 2 条记录,但在 foreach 循环中它是相同的记录两次。
SQL 服务器视图是内部联接。我还可以 post 更多信息(型号等,如果需要的话)
在 Entity Framework.
中使用 views 时存在一个微妙的问题如果您有 table,请将其与 EF 一起使用,您需要有一个 主键 来唯一标识每一行。通常,这是一个单独的列,例如ID
或类似的东西。
对于视图,您没有“主键”的概念 - 视图仅包含一些 table 中的一些列。
因此,当 EF 映射视图时,它找不到主键 - 因此,它将使用视图中的 所有 non-nullable 列 作为“替代”主键关键。
我不知道你的情况是什么 - 你应该可以从 .edmx
模型中分辨出来。
所以问题真的是你不能在视图上有明确的主键。
最简单的解决方案是 include 来自视图定义中涉及的 table 的主键(即使您不想显示它们曾经)。
那样的话,这些就会出现在视图中,并且它们会是 non-nullable,因此您应该没问题,不会得到任何重复项。