Arс*_*kaŭ 4 .net linq nhibernate
我使用NHibernate 3.2和LINQ,并在SQL中有n + 1个选择查询.在映射中,获取设置为"join".当我使用条件时,只有一个选择查询.此外,我找不到方法Fetch()或FetchMany()我在不同的例子中看到.有没有办法解决使用Linq到Nhibernate 3.2的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; }
}
Run Code Online (Sandbox Code Playgroud)
映射:
<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>
Run Code Online (Sandbox Code Playgroud)
导致许多选择的查询:
var news = newsRepository.Linq().Skip(DefaultPageSize*currentPageIndex).Take(DefaultPageSize).OrderByDescending(x => x.Date).ToList();
Run Code Online (Sandbox Code Playgroud)
这是没有多余选择的方式:
var criteria = Session.CreateCriteria<News>();
criteria = criteria.AddOrder(Order.Desc(property));
criteria = criteria.SetMaxResults(pageSize).SetFirstResult((pageNumber - 1)*pageSize);
var news = criteria.List<News>();
Run Code Online (Sandbox Code Playgroud)
试试这个:
criteria.SetFetchMode("Category",FetchMode.Eager);
Run Code Online (Sandbox Code Playgroud)
或者与Linq:
session.Query<News>()
.Fetch(k => k.Category)
.Skip(n)
.Take(m)
Run Code Online (Sandbox Code Playgroud)
或者使用QueryOver:
var result = session.QueryOver<News>
.Fetch(x => x.Category).Eager
.List();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |