2009-04-24 7 views
3

Si je devais sélectionner des lignes en fonction de certains critères, je peux utiliser l'objet ICriterion dans NHibernate.Criterion, comme ceci:En utilisant l'expression LINQ lieu de NHIbernate.Criterion

public List<T> GetByCriteria() 
    { 
    SimpleExpression newJobCriterion = 
    NHibernate.Criterion.Expression.Eq("LkpStatu", statusObject); 
    ICriteria criteria = Session.GetISession().CreateCriteria(typeof(T)).SetMaxResults(maxResults); 
    criteria.Add(newJobCriterion); 
    return criteria.List<T>(); 
    } 

Ou je peux utiliser la clause où de LINQ pour filtrer ce que je veux:

public List<T> GetByCriteria_LINQ() 
    { 

    ICriteria criteria = Session.GetISession().CreateCriteria(typeof(T)).SetMaxResults(maxResults); 

    return criteria.Where(item=>item.LkpStatu=statusObject).ToList(); 
    } 

Je préférerais le second, bien sûr. Parce que

  1. Il me donne un typage fort
  2. Je ne ai pas besoin d'apprendre encore-une autre syntaxe sous forme de NHibernate

La question est est-il un avantage de performance du premier au cours du deuxième? D'après ce que je sais, le premier va créer des requêtes SQL, donc il va filtrer les données avant de passer dans la mémoire. Ce type de performance est-il suffisamment important pour justifier son utilisation?

Répondre

3

Comme d'habitude, cela dépend. Notez d'abord que dans votre deuxième extrait il manque .List() juste après return criteria Et notez aussi que vous n'obtiendrez pas les mêmes résultats sur les deux exemples. Le premier fait où, puis retourne top maxResults, le second sélectionne tout d'abord topResults, puis fait où.

Si l'ensemble de résultats attendu est relativement petit et que vous utiliserez probablement certains résultats dans des charges paresseuses, il est préférable de prendre la deuxième approche. Parce que toutes les entités chargées à travers une session resteront dans son cache de premier niveau.

Habituellement cependant, vous ne le faites pas de cette façon et utilisez la première approche.

Peut-être que vous vouliez utiliser NHibernate.Linq (situé dans Contrib project). Ce qui fait la traduction de Linq aux critères pour vous.

1

Je combine les deux et a fait ceci:

var crit = _session.CreateCriteria(typeof (T)).SetMaxResults(100); 
return (from x in _session.Linq<T>(crit) where x.field == <something> select x).ToList(); 
Questions connexes