.net - NHibernate 3.2 LINQ n+1 求解

标签 .net linq nhibernate

我将 NHibernate 3.2 与 LINQ 一起使用,并且有 n+1 个选择查询 inq SQL。在映射中获取设置为“加入”。当我使用标准时,只有一个选择查询。我也找不到方法 Fetch()FetchMany()我在不同的例子中看到的。有没有办法使用 Linq to 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; }
}

映射:
<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>();

最佳答案

试试这个:

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();

关于.net - NHibernate 3.2 LINQ n+1 求解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616538/

相关文章:

c# - List<>.IndexOf 是按引用还是按值进行比较?

c# - Visual Studio 颜色属性编辑器中的自定义调色板

nhibernate - 如何找到与列关联的规则?

c# - 直接在磁盘上打开 XML 导出数据表到 excel

c# - `IEnumerable<T>` 文件的内容的 `.csv` 类型应该是什么?

c# - Entity Framework ToListAsync() 与 Select()

c# - 按列表属性比较相等性

.net - 关联引用未映射的类异常

c# - 在另一个标准之上使用一个标准

c# - EnumMemberAttribute 值被 DataContractJsonSerializer 忽略