2011-12-23 122 views
4

我使用NHibernate 3.2與LINQ和n + 1選擇查詢inq SQL。在映射獲取集合「加入」。當我使用標準時,只有一個選擇查詢。我也找不到方法Fetch()FetchMany(),我看到了不同的例子。是否有任何方法來解決使用Linq到Nhibernate 3.2的n + 1問題?
我的代碼NHibernate 3.2 LINQ n + 1解決方案

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

映射簡體版:

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

查詢,導致許多選擇:

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

這是怎麼了,沒有多餘的選擇:

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

也許我們可以看到,如果你告訴我們你想要做... – 2011-12-23 13:20:07

+0

@FelicePollano對不起哪個實體您AR E使用和查詢,現在代碼是在這裏 – 2011-12-23 13:58:58

回答

6

試試這個:

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

或使用LINQ:

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

或者用QueryOver:

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

它是爲標準,但我需要使用LINQ – 2011-12-23 14:03:51

+0

@ArtyomPrudnikov我更新回覆 – 2011-12-23 14:08:13

+0

非常感謝。我的錯誤是在我不正確的使用LINQ。這就是爲什麼我看不到LINQ,QueryOver和Criteria的「Fetch」 – 2011-12-23 14:15:18

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

^這是你以後在做什麼?

。查詢生活在using NHibernate.Linq;

或者有QueryOver<T>

這將是這樣的:

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