2013-02-20 3 views
0

У меня есть для каждого цикла, который использует linq для получения информации из таблицы Visit. Он вложен с другим Для каждого цикла, который получает имя в список в первом столбце:Ошибка ForEach при выходе из цикла

Caregiver | week1 | week2|.... 
__________|_______|______|.... 
John Smith| 2 | 3 |.... 
Mary Jones| 0 | 1 |.... 

Он проходит в течение 9 недель и поднимает вверх «Визит» подсчитывать в вложенном цикле. Я верю, что когда я покидаю внутренний цикл, он дает мне ошибку NULL, когда он достигает последнего Caregiver во внешнем цикле и имеет проблему, начинающуюся снова из верхней строки на следующей неделе (неделя2).

Я получаю InvalidOperationException в операторе Select перед тем, как запросить таблицу Visit на основе моего посещения Linq. Что я могу сделать, чтобы исправить это?

EDIT: Вот изображение ошибки: http://i.imgur.com/yztNLR3.png

var phs = from cg in Context.CareGivers 
      join cgg in Context.CareGiverGroups on cg.car_gvr_int_id equals cgg.car_gvr_int_id 
      join o in Context.Organizations on cgg.org_int_id equals o.org_int_id 
      where cg.row_sta_cd.Trim() == "A" 
      && cgg.alt_phy_id != null 
      && cgg.alt_phy_id.Trim() != String.Empty 
      && o.cli_acc_fg.Trim() == "Y" 
      && o.org_int_id == 1468461 
      select cg; 

int r = 1; 
int s = 1; 

for (int i = 0; i < 9; i++) 
    { 
    start = start.AddDays(i * -7); 
    end = start.AddDays(7); 

    foreach (var cg in phs) 
      { 
      // grab the correct exception, this will allow us to figure out where the issue might be 
       var visits = cg.CareGiverFunction.First(cgf => cgf.CodeDetail.cod_dtl_ds.Trim() == "Family Physician").VisitCareGiver.Select(vcg => vcg.Visit).AsQueryable(); 
       visits = visits.Where(v => v.adm_ts >= start && v.adm_ts < end 
         && (v.CodeDetail.cod_dtl_ext_id.Trim() == "I" || v.CodeDetail.cod_dtl_ext_id.Trim() == "V") 
         && v.VisitStatusCdCodeDetail.cod_dtl_ext_id.Trim() != "CANCEL"); 


       int counter = visits.Count(); 
       String phys = cg.Person.DisplayName(); 

       workbook.AddCell(r, 0, phys); 
       workbook.AddCell(r, s, counter); 
       r++; 

       } 
       s++; 

    } 
+3

Извините, но это не C! –

+0

Можете ли вы опубликовать информацию об ошибке? – GrandMasterFlush

+0

@MikyDinescu Я обновил тег сразу после публикации, спасибо. – Markpelly

ответ

0

cg.CareGiverFunction.First() не может быть возвращающая результат, это означает, что остальная часть кода у вас есть на что строка не содержит данных для сравнения.

Джон Скит ответил на подобный вопрос, я буду направлять вас на свой пост, как я сомневаюсь, что я буду в состоянии ответить на него лучше, чем он: see here

+0

Спасибо за направление. Я перехожу к следующему. – Markpelly

0

.Select заявление выглядит правильно. Что не является start = start.AddDays(i * -7). Я думаю, что вы хотите start = start.AddDays(-7). Если запуск не инициализируется каждый раз в верхней части цикла (это может пойти и на s), вы сначала возвращаетесь на 7 дней, затем еще на 14, затем на 21 больше, потом на 28. Возможно, вы сбегаете с начала данных, возвращаемых запросом?

+0

Итак, в первом столбце это будет i * -7 (i на данный момент 0), так что оказалось бы, что мы не добавим здесь никаких дней. Это правильно, потому что значение для Start - это фактически заданная дата начала. Когда он увеличится до второго столбца, он действительно переместится на i * -7 (теперь он равен 1), он добавит это -7 дней. И так далее .. – Markpelly

+0

Да, я не принимал во внимание первое появление, которое не добавило бы никаких дней. Таким образом, ваш код правильно обрабатывает первые два прогона, которые добавляют 0 и -7 дней. Как насчет следующего раза? Начиная с 7 дней до первоначального старта, теперь вы добавите еще один -14; в следующий раз еще -21, ... Нет? – shipr

Смежные вопросы