在asp.net mvc实体5的结果集中添加项

本文关键字:结果 集中 添加 asp net mvc 实体 | 更新日期: 2023-09-27 18:15:29

我看了这里的一些其他问题,但找不到我的答案。也许我没有搜索到正确的关键字。

 public partial class CheckDirectReports_Result
{
    [Key]
    public Guid? id { get; set; }
    public string NAME { get; set; }
    public string EMPLID { get; set; }
    public short EMPL_RCD { get; set; }
    public bool hasSignedOff { get; set; }
}

所以我有一个运行并返回结果的存储过程。然后我要循环遍历结果并比较ID以查看它是否存在。如果它是我想添加一个bool标志,以记录显示在视图。

        var q = results.CheckDirectReports(EMPLID);

        foreach (var i in q.ToList())
        {
            var g = results.PERSON_SIGN_OFF.Where(p => p.EMPLID == i.EMPLID).FirstOrDefault();
            if(g != null)
            {
                i.hasSignedOff = true;
            }
            else
            {
                i.hasSignedOff = false;
            }
        }
        return View(q);  

在我放入循环之前,我最初让它像这样返回,一切正常

return View(q.AsEnumerable());   

问题是它告诉我查询的结果不能被枚举多次。

这是我的观点:

@model  IEnumerable<CodeOfConduct.Models.CheckDirectReports_Result>
<h2>Manager Sign Off</h2>

@using (Html.BeginForm("Save", "Manager", FormMethod.Post))
{
<table class="table">
    <thead>
        <tr>
            <th>Name</th>
            <th>Employee ID</th>
            <th></th>
            <th>Select</th>
        </tr>
    </thead>
    <tbody>
        @foreach(var c in Model) // Print the list
        {
            <tr>
                <td>@c.NAME</td>
                <td>@c.EMPLID </td>
                @{
            if (c.hasSignedOff == true)
            {
                <td class="bg-success">Employee Has completed Sign-off</td>
            }
            else
            {
                <td class="bg-danger">Employee has not completed Sign-off</td>
            }
}
                <td>
                    @Html.ActionLink("Select Employee", "SignOff", new { ids=c.EMPLID, name = c.NAME })  

                </td>
            </tr>
        }
    </tbody>
</table>

为什么它告诉我查询的结果不能被枚举多次?

在asp.net mvc实体5的结果集中添加项

你可以返回一个List()给一个期待IEnumerable()的View。

在foreach中,通过执行q来枚举结果q。tolist()只返回q而不是q.AsEnumerable()

你可以像这样使用LINQ来缩短你的代码

    var q = results.CheckDirectReports(EMPLID).ToList();
    q.ForEach(a => {
        a.hasSignedOff = results.PERSON_SIGN_OFF.Any(p => p.EMPLID == a.EMPLID)
    });
    return View(q); 

如果results.PERSON_SIGN_OFF中的记录很少,我会将它们全部选中到list()中,然后检查EMPLID是否存在,以防止多次命中数据库。

    var q = results.CheckDirectReports(EMPLID).ToList();
    var signOffs = results.PERSON_SIGN_OFF.ToList();
    q.ForEach(a => {
        a.hasSignedOff = signOffs.Any(p => p.EMPLID == a.EMPLID)
    });
    return View(q); 

可能有更好的方法,但是我们需要更多地了解你的数据结构