AiNoTame

Dio è nella pioggia.
posts - 17, comments - 2225, trackbacks - 0

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=&gt;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 &amp; name=null: 2" //corretto?

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

Print | posted on Friday, May 17, 2013 9:33 PM | Filed Under [ EntityFramework ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET