C# NHibernate查询属性和嵌套集合的位置或位置

C# NHibernate查询属性和嵌套集合的位置或位置,c#,nhibernate,queryover,C#,Nhibernate,Queryover,我有Foo和Bar class Foo { string Name; IList<Bar> Bars; } class Bar { string Name; } this.sessionFactory.GetCurrentSession() .QueryOver() .JoinQueryOver(x=>x.bar) .Where(x=>x.Name.IsInsensitiveLike(q)) .List(); 让我们先声明别名,以便以后在查询中使用 Foo

我有
Foo
Bar

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

class Bar {
    string Name;
}
this.sessionFactory.GetCurrentSession()
.QueryOver()
.JoinQueryOver(x=>x.bar)
.Where(x=>x.Name.IsInsensitiveLike(q))
.List();

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

Foo foo = null;
Bar bar = null;
现在的第一种方法是加入集合(并得到一个有点难看的结果,为每个匹配的子项乘以父项)

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

.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)
                )
    )
)
.QueryOver(()=>foo)
.何处(限制)
.或(
限制。其中(()=>foo.Name.IsInsensitiveLike(q)),
子查询
.WhereProperty(()=>foo.ID)
.In(查询(()=>bar)
.Where(()=>bar.Name.IsInsensitiveLike(q))
.Select(y=>bar.Foo.ID)
)
)
)

这也期望,该子栏具有对Foo的反向引用。。。这是绝对合法和商业领域模型支持的。

我们可以将
.TransformUsing(Transformers.distinctroventy)
添加到您的第一个建议中,从而仅过滤出唯一的父项。不需要对第二个进行过度复杂化。你可以改变你的答案,我会接受的。我现在明白你为什么不建议使用
。TransofrmUsing
。。。它在客户端做它正在做的任何事情,这是有问题的,在我的例子中,有很多原因——分页,还有性能。如果我想跳过10行,然后得到下一个10行,并且我的
foo
s包含多个
bar
对象匹配
q
,那么我不会选择10行,而是选择更少的行,因为一个
foo
将由于连接而计数两次。
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))
Foo1, Bar1
Foo1, Bar2
.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)
                )
    )
)