从LINQ查询获取不正确的计数

时间:2015-04-08 18:12:47

标签: c# linq

我正在运行LINQ查询一些我想要更新的记录,并在将它们放回数据库之前计算。当我试图计算在第二个条件中重新分配的Linq查询时,我遇到了麻烦。

graduates = graduates.Where(m => m.NotifySentInd == false);

然而,当我选择“AllStudents”选项时,查询就像在顶部附近返回正确数量的用户,但在选择“ApprovedNotYetSent”时从不在第二个条件或我在顶部的类似查询

 public void ApproveAdultEdStudents(string Option, string CurrentYear)
 {
        var graduates = _unitOfWork.GraduateRepository.Graduates.Where(m => m.StudentTypeCd == "A" && m.SchoolYear == CurrentYear);
        System.Diagnostics.Debug.WriteLine("A: " + graduates.Count());  

        var gradsSent = graduates.Where(m => m.NotifySentInd == false);
        System.Diagnostics.Debug.WriteLine("B: " + gradsSent.Count());

        if (Option == "AllStudents") {
            foreach (var item in graduates) {
                item.NotifySentInd = true;
                item.DiplomaOrderDt = DateTime.Now;
                item.DiplomaOrderToVendorInd = false;
            }
            System.Diagnostics.Debug.WriteLine("C: " + graduates.Count());
        } else if (Option == "ApproveNotYetSent") {
            graduates = graduates.Where(m => m.NotifySentInd == false);
            foreach (var item in graduates) {
                item.NotifySentInd = true;
                item.DiplomaOrderDt = DateTime.Now;
                item.DiplomaOrderToVendorInd = false;
            }
            System.Diagnostics.Debug.WriteLine("D: " + graduates.Count());
        }
  }

当我编码时,我得到以下结果。

AllStudents
A: 69
B: 68
C: 69

ApproveNotYetSent
A: 0
B: 0
D: 0

3 个答案:

答案 0 :(得分:3)

扩展Daniel A. White的评论:

  

不要重新列举结果。

您需要对结果集进行评估,这基本上意味着在其末尾添加ToList()ToArray()

var graduates = _unitOfWork.GraduateRepository.Graduates
                           .Where(m => m.StudentTypeCd == "A" && 
                                       m.SchoolYear == CurrentYear)
                           .ToList(); // This is the line you're missing

如果没有这个,您每次都会重新查询数据库以获取结果并创建新对象,从而搞乱您的计数。

答案 1 :(得分:2)

我可以通过评论回答你,但我没有足够的代表去做,我认为你的代码中有一个拼写错误:

   else if (Option == "ApproveNotYetSent")

应该是“Aproved”没有? 无论如何,这是非常糟糕的,你应该总是使用强类型变量,为你的选项创建一个enum并将其命名为OptionType然后你可以这样做:

public void ApproveAdultEdStudents(OptionType Option, string CurrentYear)
{
    ...
    if(Option == OptionType.AllStudents)
        //do stuff
    ...
]

答案 2 :(得分:1)

试试:graduates = graduates.Where(m => m.NotifySentInd == false).ToList(); 这将创建一个列表,然后所有的计数都是相同的。