2012-01-05 7 views
0

私たちは、このコード行に今日Nullable object must have a valueエラーが発生しました:LINQはVB.NETで短絡評価をしますか?

list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate 

おかしい事は、私はこれが正常に動作するために使用してください感じ(と常に基礎データにおけるNULL値の散水があった)ということです。そして論理的にはそれは私にはうまく見えます。 HasValueAndAlsoのチェックは、ヌルの危険から私たちを守るように、のように見えます。

しかし突然彼らはそうではないようです。何か不足していますか?

list = From x In Me Where If(x.FooDate.HasValue, x.FooDate.Value.Date >= barDate,False) 

しかし、これは私には読みにくくなります。

OK、我々は、エラーを排除する、これにそれを修正することができます。何かご意見は?

更新...と告白
私は、コードの重要なチャンクを残しラインを短くするために上記のコードを簡素化するには。私は命令の第二部で丸括弧を追加する必要があるので(私自身のずっと前の質問へのoutlined in an answerなど)短絡および演算子の優先順位のルールの

list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= fromDate And x.FooDate.Value.Date <= toDate 

:元の問題のようなものを読んだことがあるはずです二x.FooDate.Value.Dateを評価LINQを停止するために:LINQは本当にAndAlsoを遵守し、元の問題をもっと詳しく見て私を強制しないことを確認するために、簡単なテストコードを投げための両方の答えに

list = From x In Me Where x.FooDate.HasValue AndAlso (x.FooDate.Value.Date >= fromDate and x.FooDate.Value.Date <= toDate) 

感謝。

+1

サンプルデータを使用してこのコードを再現できますか? –

+0

このLINQ to Objectsですか、または他のLINQプロバイダを使用していますか?また、LINQクエリ全体を含めることはできますか?あなたは少なくともSelect部分がなくなっているように見えます – StriplingWarrior

+0

このLINQ to SQLですか、私が何か変わったことを返すのですか?(例えばIEnumerableではありません)? – Richard

答えて

1

は、私は、少なくともサンプルコード以下で、クエリが安全であることをかなり確信している:

Dim dateList As New List(Of Nullable(Of Date)) 
For i As Int32 = 0 To 12 
    If (i Mod 3 = 0) Then 
     dateList.Add(Nothing) 
    Else 
     dateList.Add(New Date(2012, i, 1)) 
    End If 
Next 
Dim july = New Date(2012, 7, 1) 
Dim fromJuly = (From m In dateList 
     Where m.HasValue AndAlso m.Value.Date >= july).ToList 

注:私はあなたの例外になるだろうAndAndAlsoを置き換えたい場合。

したがって、問題は別の場所にある必要があります。あなたのクラスの詳細を教えてください。

+0

私はあなたのコードを実行して、あなたと同じ結果を得ていますので、問題は他の場所になければなりません。私は掘り続けるでしょう – hawbsl

+0

ありがとう@Timは私の更新と告白を参照してください – hawbsl

+0

@hawbsl:あなたの2番目の条件で角括弧を追加するのではなく、なぜ単純に 'And'の代わりに' AndAlso'を使いませんか?または、私は "演算子の優先順位" - 誤解を誤っている? –

1

正常に動作するはずです。私はこのコードを書いて、barDateNothingに設定しても、うまく動作します。

Sub Main() 

    Dim barDate As Nullable(Of DateTime) = Nothing 

    Dim List = From x In GetDates() Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date > barDate 

    Console.WriteLine(List.Count()) 

End Sub 

Function GetDates() As List(Of Foo) 
    Dim l = New List(Of Foo) 
    l.Add(New Foo With {.FooDate = DateTime.Now}) 
    l.Add(New Foo) 
    Return l 
End Function 

Class Foo 
    Private m_fooDate As DateTime? 
    Public Property FooDate() As DateTime? 
     Get 
      Return m_fooDate 
     End Get 
     Set(ByVal value As DateTime?) 
      m_fooDate = value 
     End Set 
    End Property 

End Class 
+0

感謝@リチャード私の更新と告白を参照してください – hawbsl

関連する問題