2010-11-25 3 views
0

J'ai le code suivant qui (évidemment) me donne d'énormes problèmes de performance, et je cherche un conseil pour l'améliorer. L'idée est, pour chaque élément de base dans une liste, je regarde s'il y a au moins un élément dérivé, et sinon, j'en crée un. Le problème est, pour chaque élément de base, il y a une requête de base de données séparée:Optimisation d'une requête NHibernate

var derivedItems = from item in baseItems select item.GetDerivedItem(session); 

public virtual DerivedListItem GetDerivedItem(ISession session) 
{ 
    var items = session.Query<DerivedItem>() 
         .Where(item => item.BaseItem == this); 
    if (items.Any()) 
     return items.First(); 
    var newItem = new DerivedItem(this); 
    session.Save(newItem); 
    return newItem; 
} 

Comment améliorer ce genre de code?

Répondre

0

Si vous utilisez des critères, vous pouvez ajouter un alias aux critères pour pré-lire les jointures de votre requête.

Ce serait quelque chose comme ceci:

DetachedCriteria.For(GetType(MyQueriedType)).CreateAlias("DerivedItem", "d", SqlCommand.JoinType.LeftOuterJoin) 

De toute évidence, vous pouvez procéder à obtenir de plus amples informations à partir d'autres tables par repeasting le processus. N'oubliez pas de mapper l'alias suivant à un alias potentiel.


En fait, si vous êtes réticent à cesser d'utiliser LINQ pour NHibernate, je recommande la recherche en joint pour LINQ to NHibernate. Peut-être this post peut aider

+0

Fantastique, je vais essayer – ulu

+0

Lorsque j'utilise DetachedCriteria.For (GetType (MyQueriedType)), j'obtiens tous les éléments du type particulier. Mais comment faire la même chose si j'ai une entité racine et une propriété de collection à partir de laquelle filtrer? – ulu