2013-04-30 8 views
6

Ich habe den folgenden Code:Anruf schlägt fehl mit null Parametern

public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) 
{ 
    AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); 
    ContactEventValue value = ent.ContactEventValues.SingleOrDefault(
     x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
     && x.ProgramCode == programCode && x.BrandCode == brandCode); 
} 

Wenn ich es mit Werten für brandCode und Programmcode nennen, erhalte ich den erwarteten Wert zurück aus der Datenbank. Als ich den Anruf zu tätigen, sondern explizit x.ProgramCode und x.BrandCode Einstellung auf null erhalte ich den erwarteten Standardwert zurück aus der Datenbank:

ContactEventValue value = ent.ContactEventValues.Single(
     x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
     && x.ProgramCode == null && x.BrandCode == null); 

Wenn jedoch nenne ich die Methode mit null für Programmcode und brandCode, I Nulle von der Datenbank zurück!

Ich versuchte, die == zu .Equals() pro der Antwort auf diese Frage zu ändern: Nullable optional parameter

So x.BrandCode.Equals (brandCode) ersetzt x.BrandCode == brandCode und x.ProgramCode.Equals (programCode) ersetzt x.ProgramCode == programCode, aber das hat immer noch nicht funktioniert.

habe ich auch versucht mit ?? Betreiber, hat immer noch nicht funktioniert.

Dieses Problem sagt eine Lösung wurde nicht gefunden, und er/sie musste eine gespeicherte Prozedur verwenden: EF 4 Query - Issue with Multiple Parameters Ich möchte wirklich nicht dorthin gehen müssen.

Irgendwelche Ideen?

Antwort

9

Ich weiß nicht, welche Version von EF Sie verwenden, aber Null Vergleich war ein Problem vor Version 5. Wenn Sie überprüfen, die tatsächlich ausgegeben wird, werden Sie wahrscheinlich sehen, dass IS NULL nicht verwendet wird in der Abfrage.

In EF 6, werden Sie in der Lage sein, die UseDatabaseNullSemantics Konfigurationsoption auf DbContext ausgesetzt zu setzen:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
     this.Configuration.UseDatabaseNullSemantics = true; 
    } 
} 

Für EF 5, können Sie die UseCSharpNullComparisonBehavior Einstellung auf die zugrunde liegenden ObjectContext verwenden:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
     var objectContextAdapter = this as IObjectContextAdapter; 
     objectContextAdapter. 
      ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;  
    } 
} 

Sie müssen jedoch .NET Framework 4.5 für Ihr Projekt verwenden. Wenn Sie 4.5 nicht verwenden möchten, können Sie eine der Problemumgehungen unter How can i query for null values in entity framework? verwenden.

+0

Wir verwenden EF 5.0.0. Ich habe versucht, UseDatabaseNullSemantics für die Konfiguration festzulegen, aber UseDatabaseNullSemantics ist nicht vorhanden. Es wurde gegoogelt und UseDatabaseNullSemantics scheint nicht in C# zu existieren. – jgerman

+0

Ich habe meine Antwort aktualisiert. – devdigital

+0

Wir verwenden .Net 4.5. Das hat funktioniert! Vielen Dank! – jgerman

1

Stellt sich heraus ?? Operator Lösung funktioniert, ich habe es einfach nicht auf beide Seiten der == Anweisungen angewendet. Der folgende Code löst das Problem:

public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) { 
    AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); 
    ContactEventValue value = ent.ContactEventValues.SingleOrDefault(
      x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
      && (x.ProgramCode ?? "") == (programCode ?? "") 
      && (x.BrandCode ?? "") == (brandCode ?? "")); 

Dies führt jedoch dazu, dass leere Zeichenfolge und null gleichwertig sind. Nicht ideal.

Verwandte Themen