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)
)
)
)