如何避免使用Linq查询?

时间:2017-05-03 08:50:09

标签: .net vb.net linq

我想在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则将其设置为空。

2 个答案:

答案 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代替AndAnd是按位运算符,始终执行比较的两个部分。如果第一部分失败,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))