Pourquoi la requête LINQ génère-t-elle une exception lorsque j'essaie d'obtenir le nombre d'un type?
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
};
Quelqu'un peut me dire pourquoi une exception est levée lors à la ligne suivante de code?
int count = dataCollection.Count();
C'est l'exception:
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 ...
source d'informationauteur thenth | 2010-09-08
Vous devez vous connecter pour publier un commentaire.
L'exception est levée lors de l'Count() parce que LINQ utilise l'exécution différée et le réel requête LINQ ne sera pas exécuté jusqu'à l'appel
.Count()
.ToList()
etc.Cela ressemble à une normale de référence nulle exception dans linq2objects alors qu'il tente d'exécuter votre prédicats ou des projections.
Les cas ont été vous obtenez un null réf exception que je peux penser sont si certains éléments de la "somedata de la collection" sont nulles, si "h.De l'année" est null (quel type?), ou si "p.somemoredate" est nulle..
Exécution différée frappe encore!
(Tout d'abord, ma première hypothèse est que cela est causé par p.somemoredate nul quelque part dans votre collection).
Donné votre exemple, il n'y a aucun moyen pour nous de vraiment savoir, puisque vous avez simplifié loin les bits qui sont interrogées. En le prenant à son visage, je dirais que ce qui "somedata" ou "somemoredate" sont les choses que vous devez regarder.
Pour comprendre cela, (quand je suis vraiment désespéré) j'ai divisé la requête en plusieurs parties et de regarder où les exceptions à être lancé. Avis de la .ToArray() appels qui sont simplement "stop" exécution différée de passe temporairement:
Cassé comme ça, c'est beaucoup plus facile de voir où l'exception est lancée, et où rechercher les problèmes.