ASP.NET MVC 5 / C# Foreach 循环 - 重复相同的数据

ASP.NET MVC 5 / C# Foreach loop - repeats same data

提问人:ExecChef 提问时间:3/10/2022 最后编辑:marc_sExecChef 更新时间:3/11/2022 访问量:1109

问:

这似乎很“初学者”,但我正在挣扎。

我有一个 SQL Server 视图,它连接了两个表(和 )。我有一个视图的模型。EmployeeCars

当我打开 SQL Server Management Studio 并查询 SQL Server 视图时,其中包含与员工 A 匹配的记录。我得到两条记录,因为员工在表中列出一次,在表中列出两次。在 SQL Server Management Studio 中,我验证了上述人员的两者是否唯一。完全符合它应该的样子。Select *EmployeeCarsCars

但是我一定在我的代码中做错了什么,在 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 Server 视图时,我得到了正确的 2 辆车 logon_id = A。但是当我通过存储库运行相同的查询时,我会得到 2 条记录,但在 foreach 循环中,它是相同的记录两次。

SQL Server 视图是内部联接。我还可以发布更多信息(如果需要,模型等)

C# SQL SQL 服务器 ASP.NET-MVC-5

评论

0赞 Chetan 3/11/2022
您是否调试了代码并检查了值?item
0赞 ExecChef 3/11/2022
是的。项目包含 2 条重复记录。但我不明白为什么。这是一个简单的 Sql 视图。我只是要求所有与logon_id匹配的记录。当我直接在 SQL 中运行时,对于 logon_id = A,我得到了两个唯一的记录,有 2 辆不同的汽车(正确)。但是我在代码中做错了什么,拉回了 2 条重复记录(不正确)。
0赞 Rahul Sharma 3/11/2022
返回正确数据的查询是什么?我在您的存储库查询中没有看到联接。只需根据 where 条件从表中进行选择即可。SQL
0赞 ExecChef 3/11/2022
这是返回正确数据的 SQL 查询:SELECT * From Web_Parkinglot_Header_FullView 其中 logon_id = 'A'
0赞 Rahul Sharma 3/11/2022
@ExecChef 然后,存储库查询看起来正确。您能否向我们展示您的操作方法,您将结果返回到您的“视图”中?Controller

答:

4赞 marc_s 3/11/2022 #1

从实体框架使用视图时,视图存在一个微妙的问题。

如果有表,请将其与 EF 一起使用,需要有一个主键来唯一标识每一行。通常,这是一列,例如 an 或类似的东西。ID

对于视图,您没有“主键”的概念 - 视图仅包含某些表中的一些列。

因此,当 EF 映射视图时,它找不到主键 - 因此,它将使用视图中所有不可为 null 的列作为“替代”主键。

我不知道这些在你的情况下是什么 - 你应该能够从模型中看出来。.edmx

所以问题在于你不能在视图上有显式的主键。

最简单的解决方案是简单地将视图定义中涉及的两个表中的主键包括在内(即使您不想显示它们)。

这样,这些将在视图中,并且它们是不可为空的,因此您应该没问题并且不会获得任何重复项。

评论

0赞 Andrew Corrigan 3/11/2022
要么使用,要么使用存储过程。