一对一Nhibernate调用多个SQL语句

时间:2014-11-11 13:52:43

标签: c# sql nhibernate fluent-nhibernate one-to-one

我有一对一循环引用的类,并假设它们看起来像这样。

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 - 因为这不能延迟加载。我怎样才能做到这一点?

2 个答案:

答案 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表中只需要几个字段时,排在顶部。