为什么linq到viewmodel的结果在MVC中是重复的

时间:2018-02-05 08:16:51

标签: c# asp.net-mvc linq

美好的一天,

我是MVC的新手。 问题:数据重复(重复)。 假设填充了不同的数据,但它看起来是相同的记录。 它占用了最后一条记录并显示所有记录相同(重复)。 我不知道我的错误在哪里。

我检查了'Qdata'填充正确的数据。但是去看模型时一直是重复的。

控制器

List<ApprovalVM> SmPSetVM = new List<ApprovalVM>();
ApprovalVM setVM = new ApprovalVM();

var Qdata = (from u in db.SSM_RegisSet
         join c in db.SSM_LinkRegisUpload on u.PKRegisId equals c.FKRegisId
         join v in db.SSM_UploadData on c.FKUpDid equals v.UplId
         join b in db.SSM_User on u.FKUserId equals b.PK_Uid
         join g in db.SSM_Department on b.FK_DepartId equals g.PK_DeptId
         join t in db.SSM_Team on b.FK_TeamId equals t.PK_TeamId
         join k in db.SSM_GM on b.FK_GMId equals k.PK_GM_id
         //where v.SN_NO == da
         //orderby u.AutoEC_id
         select new
         {
             v.PO_NO,
             v.SN_NO,
             v.Exp_NO,
             v.Model,
             v.PlanDate,
             v.Holder_Id,
             ids = "I000" + u.PKRegisId,
             c.PKLinkId,
             g.HODName,
             b.PK_Uid,
             b.UserName,
             t.PK_TeamId,
             t.TeamLeaderName,
             k.GMName
         }).ToList().OrderByDescending(v=>v.PKLinkId);

foreach (var item in Qdata)//.Where(x => x.SN_NO == da))
{
    setVM.PO_NO = item.PO_NO;
    setVM.SN_NO = item.SN_NO;
    setVM.Exp_NO = item.Exp_NO;
    setVM.Model = item.Model;
    setVM.PlanDate = item.PlanDate;
    setVM.Holder_Id = item.Holder_Id;
    setVM.POSNId = item.ids;
    setVM.PKLinkId = item.PKLinkId;
    setVM.PK_TeamId = item.PK_TeamId;
    setVM.HODName = item.HODName;
    setVM.PK_Uid = item.PK_Uid;
    setVM.UserName = item.UserName;
    setVM.TeamLeaderName = item.TeamLeaderName;
    setVM.GMName = item.GMName;
    SmPSetVM.Add(setVM);
}
return View(SmPSetVM);

查看模型

public class ApprovalVM
{
    // User
    public int PK_Uid { get; set; }
    public string UserName { get; set; }
    public string FullName { get; set; }

    // Team Leader
    public int PK_TeamId { get; set; }
    public string TeamName { get; set; }
    public string TeamLeaderName { get; set; }

    // GM Name
    public int PK_GM_id { get; set; }
    public string GMName { get; set; }
    public Nullable<bool> GMIsVisible { get; set; }

    //Department
    public int PK_DeptId { get; set; }
    public string DepartmentName { get; set; }
    public string HODName { get; set; }

    //Upload Data
    public int UplId { get; set; }
     [Display(Name = "PO No")]
    public string PO_NO { get; set; }
     [Display(Name = "S/N")]
    public string SN_NO { get; set; }
     [Display(Name = "Exp No")]
    public string Exp_NO { get; set; }
    public string Model { get; set; }
    public string PlanDate { get; set; }
    public string Holder_Id { get; set; }

    // Regis Id
    public string POSNId { get; set; }

    //Link 
    public int PKLinkId { get; set; }

    // List of Approval
    //public List<ApprovalVM> ListApproval { get; set; } 

}

查看

 <div class="col-lg-11">
        <div class="panel-body table-responsive">
            <table class="table table-striped" id="IntTrntbl">
                <tr>
                    <th>
                        No
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.POSNId)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.PO_NO)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.SN_NO)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.Exp_NO)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.Model)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.PlanDate)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.Holder_Id)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.PKLinkId)
                    </th>
                </tr>
                @{int a = 1;}
                @foreach (var item in Model)
                {
                    <tr>
                        <td>
                            @(a++)
                        </td>
                        <td style="width:10%">
                            @Html.DisplayFor(modelItem => item.POSNId)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.PO_NO)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.SN_NO)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Exp_NO)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Model)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.PlanDate)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Holder_Id)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.PKLinkId)
                        </td>
                    </tr>
                }

            </table>
        </div>
    </div>

提前致谢!

2 个答案:

答案 0 :(得分:1)

您正在循环的每次迭代中更新相同的对象。您初始化setVM一次,然后多次将其添加到列表中。因此,列表包含同一项的多个条目。当您更新foreach中的对象时,所有指向该项的引用都会引用新值。

在每次迭代中实例化一个新项目:

foreach (var item in Qdata)//.Where(x => x.SN_NO == da))
{
    setVM = new ApprovalVM();
    setVM.PO_NO = item.PO_NO;
    setVM.SN_NO = item.SN_NO;
    setVM.Exp_NO = item.Exp_NO;
    setVM.Model = item.Model;
    setVM.PlanDate = item.PlanDate;
    setVM.Holder_Id = item.Holder_Id;
    setVM.POSNId = item.ids;
    setVM.PKLinkId = item.PKLinkId;
    setVM.PK_TeamId = item.PK_TeamId;
    setVM.HODName = item.HODName;
    setVM.PK_Uid = item.PK_Uid;
    setVM.UserName = item.UserName;
    setVM.TeamLeaderName = item.TeamLeaderName;
    setVM.GMName = item.GMName;
    SmPSetVM.Add(setVM);
}

但是如果已经使用了linq,那么你可以在查询中改进和投射这个类(并使用对象初始化器语法):

return View((from u in db.SSM_RegisSet
             join c in db.SSM_LinkRegisUpload on u.PKRegisId equals c.FKRegisId
             join v in db.SSM_UploadData on c.FKUpDid equals v.UplId
             join b in db.SSM_User on u.FKUserId equals b.PK_Uid
             join g in db.SSM_Department on b.FK_DepartId equals g.PK_DeptId
             join t in db.SSM_Team on b.FK_TeamId equals t.PK_TeamId
             join k in db.SSM_GM on b.FK_GMId equals k.PK_GM_id
             //where v.SN_NO == da
             //orderby u.AutoEC_id
             select new ApprovalVM {
                 PO_NO  = v.PO_NO,
                 //And so on
             }).OrderByDescending(v=>v.PKLinkId).ToList());

最后,如果使用EF,则读入Navigation Properties。将使连接更加简单。

答案 1 :(得分:1)

这是因为你没有在foreach循环中实例化一个新的setVM。您应该在foreach循环中移动setVM对象的初始化(ApprovalVM setVM = new ApprovalVM();)。 在每次迭代中,您都会修改同一个对象并将其添加到列表中。