在 Fluent NHibernate 中,我有一个 A 类,有一个 IList 的孩子 B。
我想选择所有具有某个属性 B=="foo" 的子 B 的 A
我不想取回 A 的任何其他孩子。
得到这个的查询表达式是什么?
var list = session.Query<A>()
.FetchMany(a=>a.B)
.Where( a=>childBs.Any(b=>b=="foo"));
但这会返回所有子 B,而不仅仅是“foo”。
在 Fluent NHibernate 中,我有一个 A 类,有一个 IList 的孩子 B。
我想选择所有具有某个属性 B=="foo" 的子 B 的 A
我不想取回 A 的任何其他孩子。
得到这个的查询表达式是什么?
var list = session.Query<A>()
.FetchMany(a=>a.B)
.Where( a=>childBs.Any(b=>b=="foo"));
但这会返回所有子 B,而不仅仅是“foo”。
有一些丑陋的黑客可以让它做你想做的事(使用集合上的过滤器),但我不推荐它。为什么不反转查询并执行以下操作:
var list = session.QueryOver<B>()
.Where(b => b.B == "foo")
.Fetch(b => b.A).Eager
.List();
它不会完全满足您的要求(如果您访问 bAChildBs,它将加载该集合),但它会检索您正在寻找的数据(假设您有从 B 到 A 的关系)
NHibernate永远不会检索半加载的集合。
如果您想用一个 B 检索一个 A,请使用投影。