Подтвердить что ты не робот

Почему запрос LINQ выдает исключение, когда я пытаюсь получить счетчик типа

public readonly IEnumerable<string> PeriodToSelect = new string[] { "MONTH" };  

var dataCollection = from p in somedata    
from h in p.somemoredate    
where h.Year > (DateTime.Now.Year - 2)    
where PeriodToSelect.Contains(h.TimePeriod)  
select new  
{  
    p.Currency, 
    h.Year.Month, h.Value                                                    
}; 

Может ли кто-нибудь сказать мне, почему возникает исключение, если на следующей строке кода?

int count = dataCollection.Count();  

Это исключение:

System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Linq.Enumerable.<SelectManyIterator>d__31`3.MoveNext()
   at System.Linq.Enumerable.<SelectManyIterator>d__31`3.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at ...
4b9b3361

Ответ 1

Исключение генерируется в выражении Count(), поскольку LINQ использует отложенное выполнение, и фактический запрос LINQ не будет выполнен до вызова .Count(), .ToList() и т.д.

Ответ 2

Это выглядит как обычное исключение нулевой ссылки в linq2объектах, когда оно пытается выполнить ваши предикаты или прогнозы.

Случалось, что вы получили бы исключение null ref, о котором я могу думать, если некоторые элементы коллекции "somedata" равны null, если "h.Year" имеет значение null (какой тип это?), или если "p.somemoredate" имеет значение null.

Ответ 3

Отложенное выполнение снова ударяет!

(Во-первых, я предполагаю, что это вызвано тем, что p.somemoredate является нулевым в вашей коллекции.)

Учитывая ваш пример, мы не можем понять, так как вы упростили запросы, которые запрашиваются. Принимая это во внимание, я бы сказал, что любые "somedata" или "somemoreate" - это то, что вам нужно посмотреть.

Чтобы понять это, (когда я действительно отчаялся), я разбил запрос на части и посмотрел, где будут выбрасываться исключения. Обратите внимание на вызовы .ToArray(), которые в основном приостанавливают выполнение отложенного выполнения:

var sd = somedata.ToArray();
var x  = (from p in sd from h in p.somemoredate.ToArray()).ToArray();  //My guess is that you'll get your exception here.

Разбитый таким образом, гораздо легче увидеть, где выбрасывается исключение, и где искать проблемы.