【问题标题】:NHibernate QueryOver Where Or on property and nested collectionNHibernate QueryOver Where Or 属性和嵌套集合
【发布时间】:2019-06-02 12:33:10
【问题描述】:

我有课程FooBar

class Foo {
    string Name;
    IList<Bar> Bars;
}

class Bar {
    string Name;
}

我有一个输入 q,我想编写一个 NHibernate 查询,如果 Foo.Name 包含 q 或任何 Bars 对象的 Names 包含 @,则返回 Foo 对象列表987654330@.

我知道如何进行单独的查询,但我不确定如何将其组合为 1,并在两者之间使用 OR 运算符。基本上,如果Foo 对象在其名称或任何Bars 名称中包含q,我希望Foo 对象出现在输出中。

this.sessionFactory.GetCurrentSession()
    .QueryOver<Foo>()
    .Where(x => x.Name.IsInsensitiveLike(q))
    .List();
this.sessionFactory.GetCurrentSession()
    .QueryOver<Foo>()
    .JoinQueryOver<Bar>(x => x.Bars)
    .Where(x => x.Name.IsInsensitiveLike(q))
    .List();

【问题讨论】:

    标签: c# nhibernate queryover


    【解决方案1】:

    让我们从声明别名开始,以便以后在查询中使用

    Foo foo = null;
    Bar bar = null;
    

    现在的第一种方法是加入集合(并得到一个有点丑陋的结果,每个匹配的孩子都乘以父级)

    .QueryOver<Foo>(() => foo)
    .JoinQueryOver<Bar>(x => x.Occupations, () => bar)
    .Where(x => foo.Name.IsInsensitiveLike(q)
             || bar.Name.IsInsensitiveLike(q))
    

    这可行,但可能会返回一些重复父 Foo 的行,以防有更多匹配的子 Bar...

    Foo1, Bar1
    Foo1, Bar2
    

    为了只获得干净的父结果集,我们需要用子查询替换 JOIN

    .QueryOver<Foo>(() => foo)
    .Where(Restrictions
        .Or(
            Restrictions.Where(() => foo.Name.IsInsensitiveLike(q)),
            Subqueries
                .WhereProperty(() => foo.ID)
                    .In(QueryOver.Of<Bar>(() => bar)
                        .Where(() => bar.Name.IsInsensitiveLike(q))
                        .Select(y => bar.Foo.ID)
                    )
        )
    )
    

    这也意味着,子 Bar 具有对 Foo 的反向引用...这绝对是合法的,并且支持业务领域模型。

    【讨论】:

    • 我们可以将.TransformUsing(Transformers.DistinctRootEntity) 添加到您的第一个建议中,从而仅过滤掉唯一的父母。没有必要与第二个过于复杂。你可以改变你的答案,我会接受的
    • 再想一想,我现在明白你为什么不建议使用.TransofrmUsing ...它正在做它在客户端做的任何事情,它出于多种原因,在我的情况下是有问题的 - 分页,还有性能。如果我想跳过 10 行并获取接下来的 10 行,并且我的 foos 包含多个匹配 qbar 对象,那么我不会取 10,而是更少,因为 foo 将是由于加入,计算了两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多