NHibernate渴望加载可以使用Fetch和完成FetchMany,如在Mike Hadlow博客上的NHibernate Linq Eager Fetching中所述.
这两种方法有什么区别,在什么情况下都会使用?
想象一下这样的三个实体(客户,书籍,作者):
客户有很多书
一本书有一位作者
我使用该数据打印这样的报告:
Customer: Peter
Book: To Kill a Mockingbird - Author: Harper Lee
Book: A Tale of Two Cities - Author: Charles Dickens
Customer: Melanie
Book: The Hobbit - Author: J. R. R. Tolkien
Run Code Online (Sandbox Code Playgroud)
当我查询客户时,我按预期得到了一堆具有以下性质的查询
我可以通过包含这样的书来减少查询次数:
var customers = db.Customers.Include(c => c.Books);
但我不知道如何加载第三级(作者).我怎样才能做到这一点?
有没有人知道确定Rails关联是否已被急切加载的方法?
我的情况:我有一个结果集,有时其中一个关联是急切加载的,有时它不是.如果它没有急切加载,那么我想使用ActiveRecord的查找查找关联.如果它是急切加载,我想使用检测.
例如,假设我的项目模型中有一个shipping_info对象的"has_many"数组.然后:
如果项目是急切加载的,最有效的负载是:
item.shipping_infos.detect { |si| si.region == "United States" }
Run Code Online (Sandbox Code Playgroud)
如果项目未加载,则最有效的加载是:
item.shipping_infos.where(region: "United States").first
Run Code Online (Sandbox Code Playgroud)
但除非我知道它是否是急切加载,否则我不知道要调用哪些代码来有效地获取记录.如果我在第一种方法没有急切加载时使用它,那么我必须查找超过必要的DB记录.如果我在急切加载时使用第二种方法,那么我的急切加载对象将被忽略.
我有雄辩的查询问题.我正在使用急切加载(一对一关系)来获得' 学生 '使用' 考试 ',使用下面的代码.
Student::with('exam')->orderBy('exam.result', 'DESC')->get()
Run Code Online (Sandbox Code Playgroud)
我想通过' 考试 '中的' 结果 '列来订购收到的行.我在用
->orderBy('exam.result', 'DESC')
Run Code Online (Sandbox Code Playgroud)
但它没有用.有什么想法怎么做?
什么laravel说:
$books = App\Book::with('author.contacts')->get();
Run Code Online (Sandbox Code Playgroud)
我需要的是这样的事情
$books = App\Book::with('author[contacts,publishers]')->get();
Run Code Online (Sandbox Code Playgroud)
我们渴望在关系中加载多个关系.
这可能吗?
我的数学很差,但我很清楚笛卡尔的产品是什么.
这是我的情况(简化):
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)
我的目标是有效地加载整个项目.
问题当然是:
正如我所读到的,常见的解决方法是使用MultiQueries,但我只是不明白.
所以我希望通过这个确切的例子来学习.
如何有效加载整个项目?
Ps我正在使用NHibernate 3.0.0.
请不要用hql或字符串形式的标准api方法发布答案.
试图将我们的EF4解决方案转换为EF CTP5,并遇到了问题.
这是模型的相关部分:

相关关系: - 一个县有许多城市 - 一个城市只有一个州
现在,我想执行以下查询: - 获取系统中的所有县,并包括所有城市,以及这些城市的所有州.
在EF4中,我会这样做:
var query = ctx.Counties.Include("Cities.State");
Run Code Online (Sandbox Code Playgroud)
在EF CTP5中,我们有一个强类型的包含,它需要一个Expression<Func<TModel,TProperty>>.
我可以让县的所有城市都没有问题:
var query = ctx.Counties.Include(x => x.Cities);
Run Code Online (Sandbox Code Playgroud)
但我如何才能获得这些城市的州?
我使用纯POCO,所以County.Cities是ICollection<City>,所以我不能这样做:
var query = ctx.Counties.Include(x => x.Cities.State)
Run Code Online (Sandbox Code Playgroud)
因为ICollection<City>没有一个叫做的属性State.
这几乎就像我需要使用嵌套的IQueryable.
有任何想法吗?我是否需要回退到这个场景中包含的魔术字符串?
我可以在没有任何n + 1问题的情况下急切加载多态关系/模型.但是,如果我尝试访问与多态模型相关的模型,则会出现n + 1问题,而我似乎无法找到修复.以下是在本地查看的确切设置:
1)DB表名/数据
history

companies

products

services

2)模型
// History
class History extends Eloquent {
protected $table = 'history';
public function historable(){
return $this->morphTo();
}
}
// Company
class Company extends Eloquent {
protected $table = 'companies';
// each company has many products
public function products() {
return $this->hasMany('Product');
}
// each company has many services
public function services() {
return $this->hasMany('Service');
}
}
// Product
class Product extends Eloquent {
// each product belongs to a …Run Code Online (Sandbox Code Playgroud) polymorphism polymorphic-associations eager-loading laravel eloquent
我想加载根实体并急切加载它的所有子集合和聚合成员.
一直试图SetFetchMode在FluentNHibernate中使用它,但我在其中一个子集合中得到重复,因为我有3个级别的深度.DistinctRootEntityResultTransformer遗憾的是,只删除了根重复.
return Session.CreateInvoiceBaseCriteria(query, archived)
.AddOrder(new Order(query.Order, query.OrderType == OrderType.ASC))
.SetFetchMode("States", FetchMode.Eager)
.SetFetchMode("Attestations", FetchMode.Eager)
.SetFetchMode("AttestationRequests", FetchMode.Eager)
.SetFetchMode("AttestationRequests.Reminders", FetchMode.Eager)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Invoice>();
Run Code Online (Sandbox Code Playgroud)
我可以使用多个查询或类似的东西来存档吗?
此外,这种方法不会导致数据库中不必要的巨大结果集吗?
有什么建议?
我有一个Hibernate对象,它的属性都是懒惰加载的.大多数这些属性是其他Hibernate对象或PersistentSets.
现在我想迫使Hibernate一次性加载这些属性.
当然,我可以"触摸"这些属性,object.getSite().size()但也许还有另一种方法来实现我的目标.
eager-loading ×10
eloquent ×3
laravel ×3
nhibernate ×3
activerecord ×1
fetch ×1
hibernate ×1
java ×1
laravel-4 ×1
lazy-loading ×1
linq ×1
poco ×1
polymorphism ×1
querying ×1