2015-04-08 3 views
0

Я запускаю запрос 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 
+1

не повторно наз- вать Результаты. –

+0

Linq действует как представление, а не массив или список. Вызывая Count() или аналогичные методы, вы возвращаетесь к исходному набору данных и перечитываете этот результат. Если исходные данные разные, результат будет другим. – john

ответ

3

Чтобы развернуть на комментарий Daniel A. Уайта:

не повторно перечислить результаты.

Вам нужно сделать, оценить свой результирующий набор, который в основном означает добавление ToList() или ToArray() к концу этого.

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

Без этого, вы будете повторно запрашивать базу данных для результатов каждый раз, и создание новых объектов, тем самым портя свои счетчики.

+0

Это сработало, спасибо! – adc90

1

Попробуйте это: graduates = graduates.Where(m => m.NotifySentInd == false).ToList(); Это создаст список, а затем все графы будут одинаковыми.

2

Я мог бы ответил вам комментарием, но у меня нет достаточно респ, чтобы сделать это, я думаю, что есть опечатка в коде:

else if (Option == "ApproveNotYetSent") 

Должно быть «Aproved» нет? В любом случае это очень плохо PRACTIVE, вы должны всегда работать с сильно типизированных переменных, создать enum для ваших вариантов и назвать его OptionType, то вы можете сделать что-то вроде этого:

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