De l’utilisation intelligente d’Entity Framework 4.0

31. mai 2010

Un framework a beau être super puissant, il ne peut pas empêcher l'a mauvaise utilisation. Il peut tenter par de nombreux moyens de la réduire mais il ne peut l’empêcher.

Du moins pas sans se brider par la suite.

J’en veux pour preuve l’utilisation d’Entity Framework 4.0. Ce framework permet de manière extrêmement élégante de requêter une source de données. Et, bien utilisé, il permet aussi d’être très performant.

Voici un exemple issu d’UrzaGatherer: Mon modèle possède une collection de Card qui, entre autres, contient une propriété Check qui permet de définir si l’utilisateur détient complètement la carte en question. Dans le cadre de la treeview qui affiche les collections de cartes, je voulais modifier le texte de chaque collection en y ajoutant le nombre de cartes manquantes le cas échéant.

Pour se faire et comme tout est issu du binding dans UrzaGatherer, j’ai développé un ValueConverter utilisé ainsi:

<TextBlock Text="{Binding Converter={StaticResource CountConverter}, Mode=OneWay
, IsAsync=True}"
/>

Le code du converter était le suivant:

    public class CountConverter : IValueConverter
    {
    public object Convert(object value, Type targetType, object parameter, 
CultureInfo culture) { Expansion expansion = (Expansion) value; var query = from card in MainWindow.Entities.Cards where card.ExpansionID == expansion.ID select card; int check = 0; List<Card> cards = query.ToList(); int count = cards.Count; foreach (Card card in cards) { if (card.Check) check++; } int missing = count - check; if (missing == 0) return string.Format("- {0} cards", count); return string.Format("({0}/{1} - Missing : {2})", check, count, missing); } public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture) { return value; } }

Dans ce converter, on voit donc une requête LINQ sur les cartes en question, puis une transformation en liste pour faire notre comptage.

Et c’est là qu’apparait la mauvaise utilisation. En effet, la conversion en liste va effectivement faire la requête sur la base de données et créer les entités en mémoire. Ces entités qui peuvent être lourdes (c’est le cas ici ou chaque carte porte plusieurs images).

Tout ça pour juste obtenir un comptage.

Il faut garder à l’esprit que EF4 est efficace tant qu’on reste dans le monde des expressions LINQ, c’est à dire tant qu’on reste au final dans le monde SQL.

Ici par exemple, la solution pour être bien plus efficace est simple : Il ne faut pas utiliser de listes locales mais tout traiter en LINQ:

public object Convert(object value, Type targetType, object parameter, 
CultureInfo culture) { Expansion expansion = (Expansion) value; var query = from card in MainWindow.Entities.Cards where card.ExpansionID == expansion.ID select card; int check = query.Count(c => c.Check); int count = query.Count(); int missing = count - check; if (missing == 0) return string.Format("- {0} cards", count); return string.Format("({0}/{1} - Missing : {2})", check, count, missing); }

La différence est subtile mais ici tout se passera sur SQL Server. Aucune entité ne sera créée ni ramenée côté client. Les méthodes Count() issues de LINQ vont générer des requêtes efficaces côté serveur contrairement à la méthode ToList() qui va faire un bon gros SELECT des familles pour tout reconstruire en mémoire.

Donc en conclusion et en ce qui concerne Entity Framework 4.0 : Retardez toujours au plus tard la récupération des entités!!

Bookmark and Share

.Net, WPF ,

UrzaGatherer

31. mai 2010

Parmi mes nombreux vices, j’ai notamment le plaisir d’être collectionneur de cartes Magic.

Or cette collection est extrêmement riche et complexe à gérer. J’ai donc développé en WPF4.0, une application de gestion associée.

Elle utilise SQL Server 2008 R2 express pour stocker les dizaines de milliers d’images. Le système s’appuie sur Entity Framework 4.0 (qui d’ailleurs est une tuerie).

Je mettrai dans quelques temps le code source de l’application sur Codeplex.

image image

image image

Bookmark and Share

WPF, .Net, UrzaGatherer

YouTube dans le blog

30. mai 2010

Petit test d'intégration d'une vidéo YouTube:

Bookmark and Share

Nova, Windows Phone

Ravalement de façade

30. mai 2010

Allez hop, je profite du week-end pour basculer sur BlogEngine 1.6.1 et pour mettre à un peu à jour le look’n’feel du sitos.

 

Hope you like it!

Bookmark and Share

Blog

Nova4Phone Preview 2

8. mai 2010

image

Nova4Phone avance bien puisque les animations (positions, rotations, chemins, scaling) sont désormais gérées.

De plus le système d’actions de Nova est pris en compte: on peut donc toucher des objets pour déclencher des interactions.

Une petite vidéo pour illustrer tout ça.

 

 

  

 

Bookmark and Share

.Net, Nova, Windows Phone

Et ca continue…

3. mai 2010

image

 

Allez hop nouvelle version avec:

- Double texturation
- Culling (Back face et frustrum)
- Gestion des lightmaps
- Export direct depuis Nova

Prochaine étape:

- Collisions
- Actions

 

Ce qui est dommage c’est que je reprends le taf demain, ca va fortement réduire ma productivité :(

Par contre, au passage, XNA 4.0 ne gérera pas les shaders sur Windows Phone dans cette release. C’est fort dommage, ouh la oui!

Allez hop, petite vidéo pour voir le truc tourner en live.

Bookmark and Share

.Net, Nova, Windows Phone

Ca progresse!!

2. mai 2010

image

 

 

 

Le week-end a été prolifique. Nova4Phone grandit bien,il a pris 3 kilos et la maman va bien.

La nouvelle version supporte l’UI en mode hardware, les coordonnées de textures sont intégrées et le mécanisme de chargement/cache des scènes fonctionne.

 

De plus, cette version supporte les sous-objets ainsi que les multi-matériaux.

J’aimerai progresser sur la partie rendu (notamment la partie éclairage) mais sans shader c’est assez infaisable.

La sauvegarde se fait via l’Isolated Storage.

Ce qui me surprend le plus c’est les performances de l’émulateur. Selon plusieurs sources bien informées, il rendrait le même niveau qu’un vrai Windows Phone ce qui est une excellente nouvelle.

Avec 256 Mo de RAM et un petit processeur qui envoie du pâté basque, on se retrouve avec une bombe entre les doigts.

Voila, je continue mon voyage au petit de Windows Phone 7…

Bookmark and Share

Nova, Windows Phone