Linq to NHibernate

Sur le champ de bataille des ORM en .NET, NHibernate a fait une percée importante pendant ces vacances estivales avec le support de Linq. L’annonce d’Ayende est ici.

Regardons quelques exemples classiques d’utilisation. Nous partirons du modèle suivant, issu d’un guide sur Fluent NHibernate.

Notre modèle

Filtrer une liste d’entités sur une propriété:

var query = from store in session.Linq<Store>()
where store.Name == « SuperMart »
select store;

Charger une collection mappée avec un chargement tardif (lazy loading):

var query = from store in session.Linq<Store>()
from product in store.Products
where store.Name == « SuperMart »
select store;

Attention toutefois, car cette requête retourne un produit cartésien (n objets store identiques avec une collection chargée, n étant le nombre de produits associés au store) et non un arbre d’objets.

Écrire une requête dynamique filtrée sur une collection:

// la requête initiale

var query = from store in session.Linq<Store>()
from staff in store.Staff
from product in store.Products
select store;

// on rajoute dynamiquement des critères de recherche en rajoutant des contraintes à l’arbre d’expressions

var employee = « Harrison »;
query = query.Where(x => x.Staff.Any(y => y.LastName == employee));

Avantages de cette alternative

  • Les requêtes sont vérifiées à la compilation
  • L’IDE vous propose la complétion et le refactoring
  • Vous pouvez toujours utiliser l’API classique (ce n’est qu’un facilitateur)
  • La syntaxe est proche d’une syntaxe SQL
  • Cerise sur le gâteau : la publication de données avec ADO.NET Data Services va être possible avec NHibernate

Remarque:

  • L’implémentation n’est pas encore complète et peut conduire à des effets de bord inattendus (cf la remarque sur le produit cartésien)

2 réflexions au sujet de « Linq to NHibernate »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *