我想在Linq的对象列表上进行查询。在某些情况下,我有以下错误:
The sequence contains no elements.
我的Linq查询:
MyList.Where(Function(s) Month(s.Histo_Date) = Month(Date_Reference) - 1 And Year(s.Histo_Date) = Year(Date_Reference)).Average(Function(s) s.Nb_Doc)
经过几次搜索后我添加了这个:DefaultIfEmpty()
MyList.Where(Function(s) Month(s.Histo_Date) = Month(Date_Reference) - 1 And Year(s.Histo_Date) = Year(Date_Reference)).DefaultIfEmpty().Average(Function(s) s.Nb_Doc)
现在我发现了以下错误:
Object reference not set to an instance of an object
如何避免使用Linq查询?我喜欢将Linq查询的结果设置为0或者如果为Nothing则将其设置为空。
答案 0 :(得分:2)
DefaultIfEmpty
具有“默认”值的重载
然后在Select
之前添加DefaultIfEmpty
,您不需要检查null或创建s
Dim avg = MyList.Where(Function(s) Month(s.Histo_Date) = Month(Date_Reference) - 1 AndAlso Year(s.Histo_Date) = Year(Date_Reference)).
Select(Function(s) s.Nb_Doc).
DefaultIfEmpty(0).
Average()
无相关通知:
使用AndAlso
代替And
。 And
是按位运算符,始终执行比较的两个部分。如果第一部分失败,AndAlso
将仅执行第一部分。
实际上,您可以移除AndAlso
并使用两种Where方法 - 这些方法的出价更低,更易读/可理解
Dim monthReference = Month(Date_Reference) - 1
Dim yearReference = Year(Date_Reference)
Dim avg = MyList.Where(Function(s) Month(s.Histo_Date) = monthReference).
Where(Function(s) Year(s.Histo_Date) = yearReference).
Select(Function(s) s.Nb_Doc).
DefaultIfEmpty(0).
Average()
答案 1 :(得分:1)
您可以尝试检查Nothing
函数中的哪个部分Average
:
MyList.Where(Function(s) Month(s.Histo_Date) = Month(Date_Reference) - 1 And Year(s.Histo_Date) = Year(Date_Reference)).DefaultIfEmpty().Average(Function(s) If(s Is Nothing, 0, s.Nb_Doc))