【问题标题】:Eager Fetching with nhibernate Criteria API使用 nhibernate Criteria API 进行 Eager Fetching
【发布时间】:2012-02-07 20:20:15
【问题描述】:

我正在尝试对多个表使用标准 Api 并进行预加载。

我的精简实体如下所示:

class Limit
{
    Risk {get; set;}
}

class Risk
{
   List<Company> Companies { get;set;}
}

class Company
{
  List<Address> OldAdresses {get;set;}
}

class Address
{
  string Street { get;set;}
}

我的 Criteria 调用如下所示:

var CriterionGruppe = Expression.Eq("Account.Id", someGuid);

var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
.SetFetchMode("Risk", FetchMode.Eager)
.SetFetchMode("Risk.Companies", FetchMode.Eager)
.Add(CriterionGruppe)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Limit>();

地址仍然加载了许多选择。如何在我的标准调用中包含公司的旧地址。

我已经在 ayende 的博客中阅读了一篇博文,并在 stackoverflow 上阅读了其他几个问题。但还是没有运气。

我希望有人能指出我正确的方向。

提前谢谢彼得

When must we use eager loading in NHibernate? What is it's usage?

NHibernate Eager Fetching Over Multiple Levels

Ayende Blog

【问题讨论】:

    标签: c# nhibernate eager-loading


    【解决方案1】:
    var account = _transaktion.Session.Load<Account>(someGuid);
    var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
        .SetFetchMode("Risk", FetchMode.Eager)
        .SetFetchMode("Risk.Companies", FetchMode.Eager)
        .SetFetchMode("Company.OldAddresses", FetchMode.Eager)
        .Add(Expression.Eq("Account", account))
        .SetResultTransformer(new DistinctRootEntityResultTransformer())
        .List<Limit>();
    

    但是这是非常低效的。您正在加载大量重复数据以进行 1 个 sql 查询。更好的方法是

    1. 加载实际需要的投影
    2. 使用 Futures 和批量延迟加载来避免单个笛卡尔结果集并选择 n+1。

    【讨论】:

    • 谢谢。这就是我所希望的提示。我知道我查询的方式不是很有效。
    猜你喜欢
    • 2013-01-23
    • 2016-08-22
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多