【发布时间】:2013-02-12 09:27:48
【问题描述】:
SQL 查询是:
select B.* from A inner join B on A.b_id = B.id where A.x in (1,2,3)
A B 关系是多对一的
我需要按 A 过滤,但要获取相关的 B。
更新:
我试过这个 NH QueryOver
Session.QueryOver<A>.Where(a => a.x.IsIn(array)).JoinQueryOver(a => a.B).Select(a => a.B).List<B>()
但它会产生一个 N+1 的查询序列:第一个查询获取相关 B 的 ID,而其他查询则通过 ID 一个接一个地获取相关 B(通过 NHProf 分析)。我希望它一次性获取 B 列表。
更新 2:
现在我用子查询解决了这个问题
Session.QueryOver(() => b).WithSubquery.WhereExists(QueryOver.Of<A>().Where(a => a.x.IsIn(array)).And(a => a.b_id == b.id).Select(a => a.id)).List<B>()
但我仍然希望看到 QueryOver 的示例没有子查询,因为我倾向于认为子查询效率较低。
【问题讨论】:
-
是的,有可能,我认为你至少应该先试一试!
-
尝试在 Where(a => a.x.IsIn(array)) 之后添加一个 Fetch(a=>a.B).Eager 以摆脱 N+1 的问题。
-
@AndreLoker 它没有帮助,同样的问题。
-
子查询,应该是这样,如何根据任何过滤器形式获得
B的过滤集...等等
标签: sql nhibernate inner-join queryover