当我尝试获取类型的计数时,为什么LINQ查询会抛出异常

the*_*nth 15 c# linq linq-to-objects exception-handling

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                                                    
}; 
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么在下面的代码行中抛出异常?

int count = dataCollection.Count();  
Run Code Online (Sandbox Code Playgroud)

这是例外:

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 ...
Run Code Online (Sandbox Code Playgroud)

Die*_*lli 14

当它试图执行谓词或预测时,这看起来像是linq2objects中的普通空引用异常.

如果"somedata"集合的某些元素为null,如果"h.Year"为null(这是什么类型?),或者如果"p.",那么你会得到一个空引用异常. somemoredate"是null ..


Alb*_*nbo 2

在 Count() 语句处抛出异常是因为 LINQ 使用延迟执行,并且实际的 LINQ 查询直到调用.Count().ToList()等才会执行。

  • @Stefanvds:不,在生成的 IQueryable&lt;T&gt;/IEnumerable&lt;T&gt; 上调用 Count() 方法而不先调用 .ToList() 是非常好的。 (12认同)
  • 问题是您的属性之一为 NULL,因此当它尝试进行比较时会引发异常...比较是在“Contains”上执行的...但是当您执行“.Count()”时,您真正检索 linq 查询的结果.. (3认同)