2011-12-23 3 views
4

J'utilise NHibernate 3.2 avec LINQ et ai n + 1 requêtes de sélection inq SQL. Dans les mappages, la valeur "rejoindre" est définie. Lorsque j'utilise des critères, il n'y a qu'une seule requête de sélection. Aussi je ne peux pas trouver la méthode Fetch() ou FetchMany() que j'ai vu dans différents exemples. Existe-t-il un moyen de résoudre le problème n + 1 en utilisant Linq à Nhibernate 3.2?
Version simplifiée de mon codeNHibernate 3.2 LINQ n + 1 résolution

class News 
{ 
    public virtual int Id { get; protected set; } 
    public virtual DateTime Date { get; set; } 
    public virtual Category Category { get; set; } 
} 

class Category 
{ 
    public virtual int Id { get; protected set; } 
    public virtual ISet<News> News { get; set; } 
} 

Mappages:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="News" namespace="NewsManagement.Models"> 
<class name="News" table="News"> 
<id name="Id"> 
     <generator class="native" /> 
</id> 
<property name="Date" not-null="true" /> 
<many-to-one name="Category" fetch="join" column="CategoryId" class="Category, NHibernateManyToOne" not-null="true"/> 
</class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="News" namespace="NewsManagement.Models"> 
<class name="Category" table="Categories"> 
    <id name="Id" column="Id"> 
     <generator class="native" /> 
    </id> 
    <set name="News" fetch="join" cascade="all-delete-orphan"> 
     <key column="CategoryId" /> 
     <one-to-many class="News, NHibernateOneToMany" /> 
    </set> 
</class> 
</hibernate-mapping> 

requête qui provoque de nombreux Selects:

var news = newsRepository.Linq().Skip(DefaultPageSize*currentPageIndex).Take(DefaultPageSize).OrderByDescending(x => x.Date).ToList(); 

Voici comment il n'y a pas choisit redondant:

var criteria = Session.CreateCriteria<News>(); 
criteria = criteria.AddOrder(Order.Desc(property)); 
criteria = criteria.SetMaxResults(pageSize).SetFirstResult((pageNumber - 1)*pageSize); 
var news = criteria.List<News>(); 
+0

peut-être que nous pouvons voir si vous nous dire quelle entité vous ar Eusing et que vous voulez faire interroger ... –

+0

@FelicePollano désolé , maintenant le code est ici –

Répondre

6

Essayez avec ceci:

criteria.SetFetchMode("Category",FetchMode.Eager); 

ou Linq:

session.Query<News>() 
       .Fetch(k => k.Category) 
       .Skip(n) 
       .Take(m) 

Ou bien avec QueryOver:

var result = session.QueryOver<News> 
        .Fetch(x => x.Category).Eager 
        .List(); 
+0

il est pour les critères, mais je dois utiliser LINQ –

+0

@ArtyomPrudnikov je mettre à jour la réponse –

+0

merci beaucoup. Mon erreur était dans ma mauvaise utilisation linq. C'est pourquoi je ne pouvais pas voir 'Fetch' –

1
var result = session.Query<News>() 
        .Fetch(x => x.Category) 
        .ToList(); 

^Est-ce que vous êtes après?

.Query vit dans using NHibernate.Linq;.

Sinon il y a QueryOver<T>

qui ressemblerait à ceci:

var result = session.QueryOver<News> 
        .Fetch(x => x.Category).Eager 
        .List(); 
Questions connexes