2013-03-25 13 views
6

Es gibt Tonnen von Q & A auf Stackoverflow im Zusammenhang mit meiner Frage, aber ich kann nicht die Argumentation des Problems und die Lösung, die am besten in diesem Szenario funktioniert abzuleiten;Nullable Field und SQL ist Null Ausgabe

So habe ich eine Methode, mit der Sie eine ParentID übergeben können, und basierend auf den Wert Datensätze mit einer LINQ-Abfrage gefiltert werden. Das Feld in der Datenbank erlaubt NULL-Werte. Wenn ich jetzt Felder mit dem Operator == in der where-Klausel vergleiche, ist die ausgegebene sql falsch (IS NULL wird für den Vergleich nicht verwendet), und die Abfrage liefert daher 0 Ergebnisse. Ich löste das mit Object.Equals() Methode. Das hat funktioniert, aber jetzt bekomme ich eine Ausnahme bei der Übergabe eines NON NULL -Wertes, eine ganze Zahl

Konnte keinen konstanten Wert vom Typ 'System.Object' erstellen. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt.

Also schrieb ich eine einfache Methode

using (TestEntities context = new Entities()) 
{ 
    return from c in context.ItemMappings 
      where c.ParentID.Equals(parentID) 
      select new ItemDTO 
      { 
       ItemID = c.Item.ItemID, 
       ItemName = c.Item.ItemName, 
       ItemType = new ItemTypeDTO 
       { 
        TypeID = c.Item.Type.TypeID, 
        TypeName =c.Item.Type.TypeName 
       }; 
} 

Antwort

3

Ja Ihr Problem auch, wenn es SQL auftreten würde. Sie müssen NULL explizit behandeln, und das sollte funktionieren:

Das setzt voraus, dass Sie eine Null übereinstimmen sollen. Wenn Sie null wollen alle Ergebnisse ungefiltert zurück, stattdessen zu tun:

Where (parentID == null) || (parentID == c.ParentID) 

ich Probleme mit diesem manchmal sogar gehabt haben, und festgestellt, wäre der Weg LINQ übersetzen richtig die ganze Zeit zu tun war:

Where (parentID == null) || (parentID != null && parentID == c.ParentID) 

Dies ist, weil auch in SQL, wenn Sie tun, wo ParentID = @ParentID, eine Null-Übereinstimmung gibt keine Ergebnisse zurück, und Sie müssen ISNULL verwenden, um es zu leeren.

+0

ich, dass in einiger Zeit versuchen würde, und ich weiß, um es zu betrachten, dass es funktionieren wird. BTW, ich verstehe die Argumentation, dass ich das gleiche Problem in SQL bekomme, aber dachte, LINQ-Engine wird die richtige SQL basierend auf meinem Wert emittieren. Ich war mehr verwirrt über die Ausnahme, die ich bei der Verwendung von Object.Equals bekam –

+0

Ich bin mir nicht sicher über die Besonderheiten dieses Fehlers; das ist für mich ein neues ... Leider versucht EF nicht, solche Optimierungen in SQL-Abfragen vorzunehmen. –

1

Damit nullable Sie auch so

GSectionID = emp.SectionID ?? Guid.Empty, 
1

In EF6 Sie UseCSharpNullComparisonBehavior verwenden können, um dieses Problem zu lösen versuchen. Sie müssen die Kontextoption UseCSharpNullComparisonBehavior auf true setzen und sie wird sich wie C# verhalten.

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true; 

Mehr erfahren Sie in dem folgenden Link sehen: http://entityframework.codeplex.com/workitem/145