EF 5 – IS NULL <> = NULL

EF 5 aggiunge una importante opzione di configurazione riguardante la “traduzione” delle lambda con parametri NULL: UseCSharpNullComparisonBehavior.
Se impostata a true, il comportamento è simile al comportamento che noi Dev siamo abituati con il valore null di C#. Ma andiamo con ordine:

Tabella:
Id    Name
1    Uno
2    NULL
3    NULL
4    due
5    tre

Codice:

result = db.NullableTables.Where(e => e.Name == null).Count();
Console.WriteLine(“Entries where Name=null: {0}”, result);
               
result = db.NullableTables.Where(e => e.Name != null).Count();
Console.WriteLine(“Entries where Name!=null: {0}”, result);
               
string name = null;
result = db.NullableTables.Where(e => e.Name == name).Count();
Console.WriteLine(“Entries where Name==name & name=null: {0}”, result);

Risultato standard:
“Entries where Name=null: 2” //corretto
“Entries where Name!=null: 3” //corretto
“Entries where Name=name &amp; name=null: 0” //wrong?

Il problema dell’ultimo risultato riguarda il metodo utilizzato da EF per convertire la lamba expression “e=>e.Name=name” in TSQL: “Where Name=@p1, @p1=null”. In SQL =NULL è sempre false, al contrario del primo esempio dove EF converte la lambda in “where Name IS NULL”.

Come possiamo rendere la conversione più C# friendly? con la seguente istruzione (messa nel costruttore del nostro DbContext):
((IObjectContextAdapter)this).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;

In questo caso, rieseguendo il codice precedente, otterremo il seguente risultato:
“Entries where Name=null: 2” //corretto
“Entries where Name!=null: 3” //corretto
“Entries where Name=name & name=null: 2” //corretto?

Da notare come questa opzione sia disabilitata di default(causa compatibilità).

  1. Lascia un commento

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: