一对一Nhibernate调用多个SQL语句
本文关键字:SQL 语句 Nhibernate 调用 一对一 | 更新日期: 2023-09-27 18:30:08
我有一个一对一循环引用的类,假设它们看起来像这样。
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();
然后Nhibinates执行多个SQL语句,为每个Foo选择一个Bar。我只想选择两次。Foo一次,Bar一次——因为这不能懒惰加载。我怎样才能做到这一点?
您可能可以使用期货来实现您想要的目标。例如:
session.Query<Bar>().Fetch(x => x.Foo).ToFuture();
var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList();
其思想是,在第一个查询上使用ToFuture()
将确保两个查询同时运行,nhibernate可以使用第一个查询的结果来帮助填充第二个查询。您可能需要处理实际的查询,以使事情按您期望的方式进行。
我的问题是IBar对另一个对象有另一个循环引用,比如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表中的几个字段,这有点过头了。