gpt4 book ai didi

c# - 使用 nhibernate Criteria API 进行急切获取

转载 作者:太空狗 更新时间:2023-10-29 21:24:04 26 4
gpt4 key购买 nike

我正在尝试通过预加载对多个表使用标准 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

最佳答案

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 和 Batched 延迟加载来避免单个笛卡尔结果集并选择 n+1。

关于c# - 使用 nhibernate Criteria API 进行急切获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com