NHibernate 3.2 LINQ n + 1 solution

I use NHibernate 3.2 with LINQ and n + 1 select inq SQL queries. In the mappings, the "join" set is selected. When I use criteria, you select only one query. Also, I can not find the Fetch() or FetchMany() method, which I saw in different examples. Is there any way to solve n + 1 problem using Linq for Nhibernate 3.2?
A simplified version of my code

 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; } } 

Mapping:

 <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> 

A query calling many options:

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

So there are no redundant options:

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

Try the following:

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

or with Linq:

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

Or alternatively with QueryOver:

 var result = session.QueryOver<News> .Fetch(x => x.Category).Eager .List(); 
+6
source
 var result = session.Query<News>() .Fetch(x => x.Category) .ToList(); 

^ Is that what you need?

.Query lives in using NHibernate.Linq; .

Alternatively, there is a QueryOver<T>

What it looks like:

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

Source: https://habr.com/ru/post/1387738/


All Articles