Ответ 1
Исключение генерируется в выражении Count(), поскольку LINQ использует отложенное выполнение, и фактический запрос LINQ не будет выполнен до вызова .Count()
, .ToList()
и т.д.
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 ...
Исключение генерируется в выражении Count(), поскольку LINQ использует отложенное выполнение, и фактический запрос LINQ не будет выполнен до вызова .Count()
, .ToList()
и т.д.
Это выглядит как обычное исключение нулевой ссылки в linq2объектах, когда оно пытается выполнить ваши предикаты или прогнозы.
Случалось, что вы получили бы исключение null ref, о котором я могу думать, если некоторые элементы коллекции "somedata" равны null, если "h.Year" имеет значение null (какой тип это?), или если "p.somemoredate" имеет значение null.
Отложенное выполнение снова ударяет!
(Во-первых, я предполагаю, что это вызвано тем, что 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.
Разбитый таким образом, гораздо легче увидеть, где выбрасывается исключение, и где искать проблемы.