Frage

Ich bin mit Entity Framework, und ich habe eine KOMMENTAR Einheit. A KOMMENTAR hat eine DateModified Eigenschaft, die ein Nullable Datum ist. Ich versuche, eine Abfrage zu erstellen, die Kommentare nach Datum filtern wird, so ich eine startdate Objekt, und gehen Sie wie folgt vor:

Dim q As ObjectQuery(Of COMMENT) = _ 
   (From c In model.COMMENT Select c)

If startDate.HasValue Then
   q = q.Where(Function(c) startDate.Value <= c.DATEMODIFIED)
End If

Das Problem ist, dass q.toList () ist keine Kommentare Rückkehr, obwohl ich denke, es sollte. Alle Kommentare in der Datenbank haben DateModified Werte, und auch wenn ich in DateTime.MinValue als startdate passieren, noch die Abfrage keine Einheiten entsprechen.

setze ich einen Haltepunkt vor der If-Anweisung und verwendet, um die Visual Studio Watch-Fenster, um zu versuchen und sehen, was los ist:

q.ToList()(0).DATEMODIFIED    'Returns the expected date 
startDate.Value               'Returns the expected date 
startDate.Value <= q.ToList()(0).DATEMODIFIED    'Returns True...

Aber einmal, sobald sie die q trifft = q.Where (Prädikat) Teil, q.ToList () gibt nicht länger keine Einträge. Ich bin ratlos.

War es hilfreich?

Lösung

UPDATE: Oops, ich habe vergessen, dass mit LINQ to Entities, alle WHERE Ausdrücke in SQL übersetzt werden ruft statt nachbearbeitet werden wird in code-- so die Debugging-Vorschläge unten nicht unbedingt Arbeit.

Daher würde ich beginnen, indem die gleiche erzeugte SQL-Anweisung für die Datenbank ausgeführt wird, und die Validierung, ob die SQL, die von Ihrem Provider Entity Framework tatsächlich die Daten der Rückkehr erwartet. @Craig Stuntz Kommentar oben ist definitiv auf dem richtigen Weg dabei zu helfen, dies zu tun. Sobald Sie die parametrisierte SQL haben, würde ich versuchen, das SQL direkt von Ihrem Code ausgeführt wird (unter Verwendung von System.Data.OracleClient) und der Validierung, dass Sie tatsächlich Ergebnisse dieser Abfrage zurück. Denken Sie daran, die gleichen Parameterwerte zu injizieren, die Sie von ObjectQuery.Parameters bekommen. Alternativ können Sie die Parameter an sich selbst haften bleiben und die Abfrage von der Oracle-Client-Anwendung der Wahl auszuführen.

Wenn Sie keine Ergebnisse erhalten aus diesem SQL, dann ist es möglich, dass Devart der Anbieter die Abfrage falsch baut.

können Sie ignorieren, was hier unten ist, da es LINQ-to-Objects Fehlerbehebung gilt aber nicht LINQ-to-Entities

Einige Ideen zur Diagnose folgt aus:

zuerst, versuchen Sie dies in Ihrer Uhr Fenster:

q.Where(Function(c) startDate.Value <= c.DATEMODIFIED).Count()

Ich gehe davon aus dieser Null zurückkehren, aber es lohnt sich, wie viele andere Variablen eliminiert, um sicherzustellen, dass Sie wirklich keine Ergebnisse zu bekommen.

Als nächstes würde ich versuchen, Ihre LINQ zu definieren, ein bisschen Abfrage differently-- stattdessen die Wo von Anhängen () getrennt, versuchen zwei Abfragen verwenden, wie folgt aus:

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

Wenn das funktioniert, dann ist es etwas falsch mit, wie die Where-Klausel, um Ihre bestehende LINQ angebracht wird query-- vielleicht ein Fehler in Ihren DBMS entity-framework-Provider?

Wenn das immer noch nicht funktioniert, ist der nächste Schritt, den ich würde zu diagnostizieren wäre, um sicherzustellen, dass der Code innerhalb der where-Klausel genannt wird, und die Überprüfung der in diesen Code übergebenen Werte. Ich konnte nicht herausfinden, wie intra-Linie Stützpunkte in VB setzen, wie man in C # tun können, aber Sie können Ihr Lambda in eine separate Funktion und stellen Sie den Haltepunkt dort leicht (vorübergehend) Refactoring. Wie folgt aus:

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

Überprüfen Sie die Werte in Ihren Vergleich gesendet werden function-- sind sie gültig? Ist der Vergleich zurückgeben, was Sie erwarten, dass es?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top