C# 使用nhibernate标准API进行即时抓取
我正在尝试在多个表上使用CriteriaAPI,并进行快速加载 我的精简实体如下所示:C# 使用nhibernate标准API进行即时抓取,c#,nhibernate,eager-loading,C#,Nhibernate,Eager Loading,我正在尝试在多个表上使用CriteriaAPI,并进行快速加载 我的精简实体如下所示: 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;}
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;}
}
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>();
类别限制
{
风险{get;set;}
}
类别风险
{
列出公司{get;set;}
}
阶级公司
{
名单
var账户=\u transaktion.Session.Load(someGuid);
var temp=_transaktion.Session.CreateCriteria(typeof(Limit))
.SetFetchMode(“风险”,FetchMode.Eager)
.SetFetchMode(“Risk.companys”,FetchMode.Eager)
.SetFetchMode(“Company.OldAddresses”,FetchMode.Eager)
.Add(表达式.Eq(“Account”,Account))
.SetResultTransformer(新DistincTrotentyResultTransformer())
.List();
但是,这是非常低效的。您正在加载大量重复数据以进行sql查询。更好的方法是
加载实际需要的内容的投影
使用未来和批处理延迟加载来避免单个笛卡尔结果集,并选择n+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>();