我有一对一循环引用的类,并假设它们看起来像这样。
public class Foo
{
public Bar Bar { get; set; }
/* Some irrelevant code */
}
和
public class Bar
{
public Foo Foo { get; set; }
/* Some irrelevant code */
}
和流利的nhibernate地图
BarMap
{
Table("Bars");
// Some mappings
Reference(x => x.Foo).Column("FooId");
}
FooMap
{
Table("Foos");
// Some Mappings
HasOne(x => x.Bar).PropertyRef(x => x.Foo).Not.Lazy.Cascade.SaveUpdates();
}
我意识到你不能懒惰加载nhibernate中的一对一关系所以我想要做的就是选择所有的Bars并在我想要Foo的东西时将它加入Foo。 我想我需要获取Bar但是当我执行时:
var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList();
Nhibernates然后执行多个SQL语句,为每个Foo选择一个Bar。我只想选择两次。一次为Foo,一次为Bar - 因为这不能延迟加载。我怎样才能做到这一点?
答案 0 :(得分:0)
您可以使用期货来完成您想要的任务。例如:
session.Query<Bar>().Fetch(x => x.Foo).ToFuture();
var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList();
这个想法是在第一个查询上使用ToFuture()
将确保两个查询同时运行,并且nhibernate可以使用第一个查询的结果来帮助填充第二个查询。您可能需要使用实际查询来使事情按预期方式运行。
答案 1 :(得分:0)
我的问题是,我对另一个对象有另一个循环引用,比如Baz:
BarMap
{
Table("Bars");
Reference(x => x.Foo).Column("FooId");
HasOne(x => x.Bar).PropertyRef(x => x.Bar).Not.Lazy.Cascade.SaveUpdates();
}
BazMap
{
Table("Baz");
Reference(x => x.Foo).Column("BarId");
}
所以我通过加入Foo,Bar和Baz解决了这个问题。
var Foos = session
.Query<Foo>()
.Fetch(x => x.Bar)
.ThenFetch(x => x.Baz)
.ToList();
考虑到我在Foos表中只需要几个字段时,排在顶部。