2013-04-30 8 views
6

Ho il seguente codice:chiamata sta venendo a mancare con il parametro nullo

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); 
} 

Quando chiamo con valori per brandCode e programCode, ottengo il valore atteso di nuovo dal database. Quando faccio la chiamata, ma impostando esplicitamente x.ProgramCode e x.BrandCode a null ottengo il valore di default atteso indietro dal database:

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

Tuttavia, quando chiamo il metodo con null per programCode e brandCode, io ottenere null dal database!

Ho provato a cambiare il == per .equals() per la risposta a questo problema: Nullable optional parameter

So x.BrandCode.Equals (brandCode) x.BrandCode sostituito == brandCode, e x.ProgramCode.Equals (programCode) sostituito x.ProgramCode == programCode, ma non funzionava ancora.

Ho provato anche ad usare il ?? operatore, ancora non ha funzionato.

Questo problema indica che non è stata trovata una soluzione e che è stato necessario utilizzare una stored procedure: EF 4 Query - Issue with Multiple Parameters Non voglio davvero dover andare lì.

Qualche idea?

risposta

9

Non so quale versione di EF si sta utilizzando, ma il confronto nullo era un problema precedente alla versione 5. Se si ispeziona l'SQL che viene effettivamente emesso, probabilmente si vedrà che IS NULL non viene utilizzato nella query.

In EF 6, sarete in grado di impostare l'opzione di configurazione UseDatabaseNullSemantics esposto su DbContext:

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

per EF 5, è possibile utilizzare l'impostazione UseCSharpNullComparisonBehavior sul sottostante ObjectContext:

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

Tuttavia, sarà necessario utilizzare .NET Framework 4.5 per il progetto. Se non si desidera utilizzare 4.5, è possibile utilizzare uno dei workaround elencati a How can i query for null values in entity framework?.

+0

Stiamo usando EF 5.0.0. Ho provato a impostare UseDatabaseNullSemantics su Configuration, ma UseDatabaseNullSemantics non esiste. Cerca su Google e UseDatabaseNullSemantics non sembra esistere in C#. – jgerman

+0

Ho aggiornato la mia risposta. – devdigital

+0

Stiamo usando .Net 4.5. Ha funzionato! Grazie mille! – jgerman

1

Risulta il ?? la soluzione operatore funziona, semplicemente non l'ho applicata su entrambi i lati delle dichiarazioni ==. Quindi il seguente codice risolve il problema:

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 ?? "")); 

Tuttavia, ciò causa la stringa vuota e null per essere equivalente. Non ideale

Problemi correlati