如何为层次结构编写QueryOver

时间:2013-12-05 06:22:05

标签: c# asp.net-mvc-4 nhibernate

我的数据库结构中有以下层次结构 -

  

一个 JobOrder 有多个模板

     

一个模板有多个群组

     

一个群组有多个

     

一个商品有一个状态,一个状态有一个商品(一对一)

我已经将这些表映射到我在NHibernate中的模型,它也正常工作。 这种一对一关系已经这样映射 -

Item.hbm.xml:

<one-to-one name="Status" class="ItemStatus"></one-to-one>

Status.hbm.xml:

 <id name="Id" column="Id" type="long">
  <generator class="foreign" >
    <param name="property">Item</param>
  </generator>
 </id>
 <one-to-one name="Item" class="ItemInGroup" constrained="true"></one-to-one>

我想写一个nhibernate QueryOver,它会返回所有在其层次结构中至少有一个状态为null的作业的命令。

我尝试写下以下内容 -

var jobOrders =
            Repository.QueryOver<Models.JobOrder>().Where(
                jo => jo.Templates.Any(t => t.Groups.Any(g => g.Items.Any(i => i.Status==  
                    null)))).List();

但它抛出异常 -

  

无法识别的方法调用:System.Linq.Enumerable:Boolean任何[TSource](System.Collections.Generic.IEnumerable 1[TSource], System.Func 2 [TSource,System.Boolean])

我该怎么写?

1 个答案:

答案 0 :(得分:0)

您需要使用JoinQueryOverJoinAlias
这样的事情应该有效(没有经过测试,但你应该明白这一点):

var jobOrders = Repository
    .QueryOver<Models.JobOrder>()
    .JoinQueryOver<Models.Template>(j => j.Templates)
    .JoinQueryOver<Models.Group>(t => t.Groups)
    .JoinQueryOver<Models.Item>(g => g.Items)
    .Where(i => i.Status == null)
    .List<Models.JobOrder>();