Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用nhibernate标准API进行即时抓取_C#_Nhibernate_Eager Loading - Fatal编程技术网

C# 使用nhibernate标准API进行即时抓取

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;}

我正在尝试在多个表上使用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;}
}
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>();