NHibernate获取包括儿童和一个条件

问题描述:

对NHibernate来说是相对新的我已经继承了一些我必须修改的基本代码。我有一堆类型为Group的对象。每个组可以有一个或多个类型为Group的孩子,孩子也可以有Group类型的孩子等等。每个Group对象都有一个名为Deleted的属性/字段,其值为“deletedgroup”(一种软删除)。如果一个组的“已删除”字段设置为“已删除组”,则不应该选择,所以儿童和大孩子也应该这样选择。换句话说,我需要获得没有将删除字段设置为“已删除组”的所有组的列表。 我有这段代码被继承,但它没有包含新的删除字段的标准,即代码检索所有组。 如何扩展代码以满足我的请求。我已经尝试过.Where和.Criteria,但是我得到了编译错误和限制不起作用。NHibernate获取包括儿童和一个条件

Enherited代码(选择所有组):

var allGroups = ObjectFactory.GetInstance<IUnitOfWork>().Session 
         .QueryOver<Group>() 
         .Fetch(g => g.ChildGroups).Eager 
         .Fetch(g => g.Vacancies).Eager 
         .TransformUsing(new DistinctRootEntityResultTransformer()) 
         .List(); 

我通常有利于LINQ查询与NH因为我发现的语法更直观。 NH的LINQ提供商并不完美,有时候QueryOver远远优于此。然而,在这种情况下,我觉得这LINQ基于查询应为你工作:

var activeGroupIds = 
    ObjectFactory.GetInstance<IUnitOfWork>().Session 
     .Query<Group>() 
     .Where(g => g.Deleted != "deletedgroup") 
     .Select(g => g.Id); 

var allGroups = 
    ObjectFactory.GetInstance<IUnitOfWork>().Session 
     .Query<Group>() 
     .FetchMany(g => g.ChildGroups) 
     .FetchMany(g => g.Vacancies) 
     .Where(g => activeGroupIds.Contains(g.Id)) 
     .ToList(); 

也许试试这个,看看它是否有预期的效果。

+0

没有工作。看起来像where子句过滤出每个组,所以结果为零组,就像我经历过使用带有where子句的orignal查询一样。 省略where子句将返回所有组作为原始查询。 – Torben

+0

啊。那么你是否需要类似相关的子查询,它首先找到符合条件的组并使用“Deleted!=”deletedgroup“',然后只返回该列表中的组? –

+0

我用这个概念编辑了我的答案,但我不确定这正是你要找的。 –