相关疑难解决方法(0)

使用NHibernate 3.0.0时战斗笛卡尔积(x-join)

我的数学很差,但我很清楚笛卡尔的产品是什么.
这是我的情况(简化):

public class Project{
 public IList<Partner> Partners{get;set;}
}
public class Partner{
 public IList<PartnerCosts> Costs{get;set;}
 public IList<Address> Addresses{get;set;}
}
public class PartnerCosts{
 public Money Total{get;set;}
}
public class Money{
 public decimal Amount{get;set;}
 public int CurrencyCode{get;set;}
}
public class Address{
 public string Street{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我的目标是有效地加载整个项目.

问题当然是:

  • 如果我试图加载合作伙伴及其成本,查询返回大量行
  • 如果我懒加载Partner.Costs,db会收到垃圾邮件请求(比第一种方法快一点)

正如我所读到的,常见的解决方法是使用MultiQueries,但我只是不明白.
所以我希望通过这个确切的例子来学习.

如何有效加载整个项目?

Ps我正在使用NHibernate 3.0.0.
请不要用hql或字符串形式的标准api方法发布答案.

nhibernate cartesian-product eager-loading

32
推荐指数
2
解决办法
8284
查看次数

渴望用nhibernate Criteria API获取

我试图在多个表上使用标准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;}
}
Run Code Online (Sandbox Code Playgroud)

我的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>();
Run Code Online (Sandbox Code Playgroud)

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

我已经在ayende的博客中阅读了博客文章,并在stackoverflow上阅读了其他几个问题.但仍然没有运气.

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

在此先感谢彼得

什么时候我们必须在NHibernate中使用急切加载?它的用途是什么?

NHibernate渴望获得多个级别

Ayende博客

c# nhibernate eager-loading

6
推荐指数
1
解决办法
4859
查看次数

标签 统计

eager-loading ×2

nhibernate ×2

c# ×1

cartesian-product ×1