Accueil > .Net, C#, Développement > Entity Framework et NULL

Entity Framework et NULL

Décidément, y a des fois où j’ai pas de bol🙂

Le scénario est assez simple : j’ai une méthode qui doit aller chercher une ou plusieurs entrées en base de données.
Le critère de recherche est sur un champ nullable.

(Note : c’est la même table que là : ADO.Net Entity Data Model et champs avec valeur par défaut)

Du genre :

public IEnumerable<MATABLE> GetValue(SAMPLESEntities context, string search)
{
    return context.MATABLE.Where(m => m.COLONNE2 == search);
}

Jusque là, rien de bien gênant.
Mais…est si la variable search est nulle ???

Voici la requête exécutée par EF dans le cas de la méthode ci-dessus :

exec sp_executesql N'SELECT 
   [Extent1].[PK] AS [PK], 
   [Extent1].[COLONNE1] AS [COLONNE1], 
   [Extent1].[COLONNE2] AS [COLONNE2], 
   [Extent1].[COLONNE3] AS [COLONNE3], 
   [Extent1].[CREATION] AS [CREATION]
   FROM [dbo].[MATABLE] AS [Extent1]
   WHERE [Extent1].[COLONNE2] = @p__linq__0',
N'@p__linq__0 varchar(8000)',@p__linq__0=NULL

Et voici la requête exécutée si on fait

context.MATABLE.Where(m => m.COLONNE2 == null);
SELECT 
   [Extent1].[PK] AS [PK], 
   [Extent1].[COLONNE1] AS [COLONNE1], 
   [Extent1].[COLONNE2] AS [COLONNE2], 
   [Extent1].[COLONNE3] AS [COLONNE3], 
   [Extent1].[CREATION] AS [CREATION]
   FROM [dbo].[MATABLE] AS [Extent1]
   WHERE [Extent1].[COLONNE2] IS NULL

La différence est notable, non ?
Pourquoi ?
Parce que !
…NULL n’est pas une valeur ! (et c’est pas nouveau ^^)

Il faut donc gérer dans le code C# la possibilité que la variable soit nulle.
Voici un billet bien foutu qui en décrit : NULL value handling in Entity Framework.

A noter, tout de même que l’article parle d’un context (SAMPLESEntities, dans l’exemple) héritant de DbContext. Si le votre hérite de ObjectContext, eh bah c’est mort.
Dans ce cas, il faudra tester la valeur à la main pour réaliser le conditionnement qui va bien.

Un truc du genre :

return string.IsNullOrEmpty(search)
    ? context.MATABLE.Where(m => m.COLONNE2 == null)
    : context.MATABLE.Where(m => m.COLONNE2 == search);
Catégories :.Net, C#, Développement
  1. Aucun commentaire pour l’instant.
  1. 25/09/2014 à 17:54

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :