更新:おっと、LINQ to Entitiesでは、すべてのWHERE式がコードで後処理されるのではなくSQL呼び出しに変換されることを忘れました。そのため、以下のデバッグの提案は必ずしも機能しません。
したがって、データベースに対して同じ生成されたSQLステートメントを実行し、EntityFrameworkプロバイダーによって生成されたSQLが実際に期待するデータを返しているかどうかを検証することから始めます。上記の@CraigStuntzのコメントは、これを行うのに役立つ正しい方向に進んでいます。パラメータ化されたSQLを取得したら、(を使用して)コードから直接そのSQLを実行しSystem.Data.OracleClient
、そのクエリから実際に結果が返されることを検証してみます。から取得したものと同じパラメータ値を挿入することを忘れないでくださいObjectQuery.Parameters
。または、パラメータを自分で固定して、選択したOracleクライアントアプリからクエリを実行することもできます。
そのSQLから結果が得られない場合は、devArtのプロバイダーがクエリを誤って作成している可能性があります。
LINQ-to-Objectsのトラブルシューティングには適用されますが、LINQ-to-Entitiesには適用されないため、以下は無視してかまいません。
これを診断するためのいくつかのアイデア:
まず、ウォッチウィンドウでこれを試してください。
q.Where(Function(c) startDate.Value <= c.DATEMODIFIED).Count()
これはゼロを返すと思いますが、実際に結果が得られないようにするために、他の多くの変数を削除する価値があります。
次に、LINQクエリを少し異なる方法で定義してみます。Where()を個別に追加する代わりに、次のような2つのクエリを使用してみてください。
Dim q As ObjectQuery(Of COMMENT)
If startDate.HasValue Then
q = (From c In model.COMMENT Where startDate.Value <= c.DATEMODIFIED Select c)
Else
q = (From c In model.COMMENT Select c)
End If
これが機能する場合は、Where句が既存のLINQクエリにアタッチされている方法に問題があります。おそらく、DBMSのentity-frameworkプロバイダーのバグですか。
それでも機能しない場合は、次の診断手順として、where句内のコードが呼び出されていることを確認し、そのコードに渡された値を確認します。C#のようにVBで行内ブレークポイントを設定する方法を理解できませんでしたが、ラムダを別の関数に簡単に(一時的に)リファクタリングして、そこにブレークポイントを設定できます。このような:
Sub Main()
Dim testDate As Date = New Date(2005, 1, 1)
Dim x = New List(Of Date?)
x.Add(New Date(2009, 1, 1))
x.Add(New Date(2008, 1, 1))
x.Add(New Date(2007, 1, 1))
x.Add(New Date(2006, 1, 1))
x.Add(New Date(2005, 1, 1))
x.Add(New Date(2004, 1, 1))
x.Add(New Date(2003, 1, 1))
x.Add(New Date(2002, 1, 1))
x.Add(New Date(2001, 1, 1))
Dim y = From n In x Select n
y = y.Where(Function(val) test(val, testDate))
Dim z = y.ToArray()
End Sub
Function test(ByVal date1 As Date, ByVal date2 As Date) As Boolean
test = date1 >= date2
End Function
比較関数に送信されている値を確認してください-それらは有効ですか?比較はあなたが期待するものを返しますか?