0

У меня есть DataTable и хочу выбрать несколько записей с Linq в этом формате:NullReferenceException Ошибка при попытке итерации в IEnumerator

var result2 = from row in dt.AsEnumerable() 
           where row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase) 
            && (String.Compare(row.Field<string>("StrDate"), dtStart.Year.ToString() + 
                        (dtStart.Month < 10 ? '0' + dtStart.Month.ToString() : dtStart.Month.ToString()) + 
                        (dtStart.Day < 10 ? '0' + dtStart.Day.ToString() : dtStart.Day.ToString())) >= 0 
            && String.Compare(row.Field<string>("StrDate"), dtEnd.Year.ToString() + 
                        (dtEnd.Month < 10 ? '0' + dtEnd.Month.ToString() : dtEnd.Month.ToString()) + 
                        (dtEnd.Day < 10 ? '0' + dtEnd.Day.ToString() : dtEnd.Day.ToString())) <= 0) 
           group row by new { Year = row.Field<int>("Year"), Month = row.Field<int>("Month"), Day = row.Field<int>("Day") } into grp 
           orderby grp.Key.Year, grp.Key.Month, grp.Key.Day 
           select new 
           { 
            CurrentDate = grp.Key.Year + "/" + grp.Key.Month + "/" + grp.Key.Day, 
            DayOffset = (new DateTime(grp.Key.Year, grp.Key.Month, grp.Key.Day)).Subtract(dtStart).Days, 
            Count = grp.Sum(r => r.Field<int>("Count")) 
           }; 

и в этом коде, я стараюсь повторять его с помощью следующего кода:

foreach (var row in result2) 
{ 
    //... row.DayOffset.ToString() + .... 
} 

Эта проблема возникла: Ссылка на объект не установлена ​​в экземпляр объекта.

Я думаю, что это происходит, когда нет записи с вышеуказанными критериями. Я пытался изменить его Enumerator, как это, и использовать MoveNext(), чтобы проверить данные о том, что или нет:

result2.GetEnumerator(); 
if (enumerator2.MoveNext()) {//--} 

, но все та же ошибка.

В чем проблема?

+0

@SarahN. .. 'if (result2! = null) foreach (......) {...}' –

+0

@Thirisangu. Запрос linq никогда не вернет 'null'. Проблема заключается в запросе. – sloth

+0

@Sloth Запрос LINQ никогда не возвращает 'null' !!! :( –

ответ

2

Я думаю, в одной или нескольких рядах Media есть null.

Затем вы звоните Equals по телефону null, что приводит к NullReferenceException.

Вы можете добавить нулевой чек:

var result2 = from row in dt.AsEnumerable() 
       where row.Field<string>("Media") != null 
       && row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase) 
       ... 

или использовать суррогатное значение как:

var result2 = from row in dt.AsEnumerable() 
       let media = row.Field<string>("Media") ?? String.Empty 
       where media.Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase) 
       ... 

(обратите внимание, что последний подход немного отличается)

+0

хороший улов я думаю, что я пошел в неправильном направлении здесь .... –