我有一个会话条件语句(Fluent NHibernate),即使我已定义了表达式/限制,它似乎也不会过滤子集合。
ICriteria criteria = session.CreateCriteria(typeof(MyClass));
criteria.CreateAlias("MyCollection", "MC");
criteria.Add(Restriction.Eq("MC.Property", value));
IList<MyClass> list = criteria.List<MyClass>();
这将返回MyClass
类型MyCollection.Property = value
的所有对象,但MyCollection
未过滤为MyCollection.Property = value
似乎只有Root对象被过滤了。
感谢。
答案 0 :(得分:3)
这是正确的,它只会过滤根实体。如果查询更改了根实体集合中的项目,则可能会遇到一个可怕的问题:如果再次保存实体,那么从集合中过滤掉的项目将永久删除。当然没有人想要那样。
如果你想要这种行为,你必须手动完成(在实体加载后通过foreach),虽然我不会因为上述原因而推荐它。我的兴趣是使集合中的实体成为查询的根。
答案 1 :(得分:2)
我只发现了一些关于这样做的狡猾的链接 - 所以这是你自己的风险:)。
如果添加以下内容,它似乎应该可以使用:
criteria.CreateCriteria("MC", JoinType.LeftOuterJoin);
根据佩德罗的回答,我不推荐它。