Archive

Archive for the ‘C#’ Category

[C#] Utiliser des tables temporaires avec Entity Framework

Ça fait maintenant quelques temps que je travaille avec Entity Framework et, s’il est très bien, il pêche majoritairement sur un point (dans le cadre de mon usage) : le traitement du volume.
Donc, dans ce billet, je vais présenter une petite solution montrant ce que j’ai fait pour combler ce problème.

Lire la suite…

Catégories :.Net, C#, Développement

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

ADO.Net Entity Data Model et champs avec valeur par défaut

Récemment, j’ai eu un problème lors de l’insertion avec Entity Framework.
Le cas est assez simple : je ne spécifiais pas de valeur sur une colonne non nullable mais ayant une contrainte de valeur par défaut.
Et là, bam : « Impossible d’insérer la valeur NULL dans la colonne ‘[COLONNE]’, table ‘[BASE].[SCHEMA].[TABLE]’. Cette colonne n’accepte pas les valeurs NULL. Échec de INSERT. L’instruction a été arrêtée. »

Donc, ce billet va donner le cas de test et les solutions pour le gérer.

Lire la suite…

Catégories :.Net, C#, Développement

WiX

J’avais déjà parlé de WIX dans un billet : How to Start : WIX (ça peut être utile de le lire en premier, si vous ne connaissez pas WiX).
Je suis récemment revenu dessus pour créer un installeur « un peu » custom.

Au programme, donc :

  • Ajouter une icône au programme
  • Déployer des fichiers dans un sous-répertoires
  • Modifier un champ dans l’App.Config depuis l’installeur
  • Paramétrer la chaîne de connexion EF depuis l’installeur
  • Déboguer les Custom Actions
  • Passer des paramètres à l’installeur

Lire la suite…

Catégories :.Net, C#, WIX

[C# EF5] Requêtes Compilées

Ce billet fait suite à la petite série sur l’optimisation.
La situation est expliquée ici Optimisations C#, Entity Framework et Sql, donc je n’y reviendrais pas.

Ce billet va traiter d’une optimisation au niveau de LINQ : les requêtes compilées.

Le scénario :
J’ai une liste de N éléments, peut être 1, mais dans mon test de charge : 50.000.
Chaque élément est un objet contenant une agrégation logique des plusieurs autres objets que je peuple au fil des traitements.
Je dois peupler l’un d’eux à partir d’une table très grosse (la même table qu’avant, avec ces 75 millions d’entrées).

Lire la suite…

Catégories :.Net, C#, Développement

[C#-TSQL] FORCESEEK et Entity Framework

Ce billet fait suite à la petite série sur l’optimisation.
La situation est expliquée ici Optimisations C#, Entity Framework et Sql, donc je n’y reviendrais pas.

Ce présent billet va traiter du hint FORCESEEK sur SQL Server et comment l’utiliser avec Entity Framework.

Lire la suite…

Catégories :.Net, C#, Développement

[C# Design Pattern] Injection de dépendances et Unity

Aujourd’hui, on va parler un peu de Unity et d’injection de dépendances.

C’est un projet issue du projet open source Enterprise Library (EntLib de son petit nom).
Mais pour faciliter la gestion de l’open source, le projet a été refactoré en 10 projets différents, correspondant à 10 blocks logiques. Plus de détail sont disponibles ici : Microsoft Enterprise Library – Open Development Model.

Ainsi, Unity possède son propre repository sous Codeplex : patterns & practices – Unity.
Unity possède également sa propre documentation sur la MSDN : Unity Container.
Enfin, Unity est disponible via NuGet : Unity 3.0.1304.1 (il y a d’autres versions dispos en bas de page).

Dans le cas de ce billet, la version utilisée est la version 2.1.505.2.

Lire la suite…