【问题标题】:NHibernate: Reverse Exists CriteriaNHibernate:反向存在标准
【发布时间】:2012-06-25 14:38:15
【问题描述】:

我正在查询FooFoo 没有 IList<FooBar> 属性(很遗憾)。 FooBar 有一个Foo 属性(但不是Bar),Bar 有一个IList<FooBar>。我需要所有Foos,其中存在一个FooBar,它有一个对应的Bar,而BarDate字段等于今天。

我不是 Criteria API 的真正专家,但使用与否不是我的选择。


编辑:我用QueryOver API 尝试了同样的方法,并做到了这一点:

 var q1 = session.QueryOver<Foo>()
                 .WithSubquery.WhereExists<Bar>(
                     session.QueryOver<Bar>()
                            .Where(b => b.Date == DateTime.Today)
                            .JoinQueryOver<FooBar>(b => b.FooBars)
                            .Where(fb => fb.Foo == /*???*/ ))
                 .List<Foo>();

我在/*???*/的地方写什么?

【问题讨论】:

    标签: sql nhibernate nhibernate-criteria queryover


    【解决方案1】:

    早期免责声明 - 我现在没有安装 NHibernate,所以这是未经测试的,但我会用这样的方式来处理它:

    var foos = session.CreateCriteria<Bar>("bar")
                          .CreateCriteria("FooBars", "foobar")
                          .Add(
                             Restrictions.Eq(
                                "bar.Date", 
                                DateTime.Today.ToString("d", CultureInfo.InvariantCulture)
                             ))
                          .SetProjection(Projections.Property("foobar.Foo"))
                          .List<Foo>();
    

    【讨论】:

    • 等等... FooBar 没有 Bar 关联,我明确说过
    • 糟糕,我错过了...出于好奇,您是否有一个实际上没有连接表的原因...您知道...加入任何东西?
    • 他们加入,在另一个方向。 Bar->FooBars->Foo
    • 好的,有道理。是否有理由不能立即撤销查询?我会更新我的答案以显示我在说什么。
    • 除了这个查询返回代理的奇怪事实之外,我的所有其他查询都返回真实对象,这工作得很好!接受。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多