Nhibernate查询问题

Nhibernate查询问题,nhibernate,criteria,Nhibernate,Criteria,考虑以下映射文件,其中TemporaryAccessOpenCommand和TemporaryAccessCloseCommand都继承自基类命令 <class name="Command" table="xxx_Commands" lazy="false"> <id name="Id" type="Int32" unsaved-value="0"> <generator class="identity"/> </id> <propert

考虑以下映射文件,其中TemporaryAccessOpenCommand和TemporaryAccessCloseCommand都继承自基类命令

<class name="Command" table="xxx_Commands" lazy="false">
<id name="Id" type="Int32" unsaved-value="0">
  <generator class="identity"/>
</id>
<property name="BeginDate" />
<property name="EndDate" />
<component name="Result" class="CommandResult">
  <property name="Status" column="ResultStatus"/>
  <property name="Details" column="ResultDetails" />
</component>

<many-to-one name="Requestor" class="xxx.Domain.SessionInfo, xxx.Domain" column="SessionInfoId" lazy="false" />

<joined-subclass name="xxx.TemporaryAccess.Commands.TemporaryAccessCloseCommand, xxx.TemporaryAccess" table="xxx_Commands_TemporaryAccess_Close">
  <key column="CommandId"/>
</joined-subclass>

<joined-subclass name="xxx.TemporaryAccess.Commands.TemporaryAccessOpenCommand, xxx.TemporaryAccess" table="xxx_Commands_TemporaryAccess_Open">
  <key column="CommandId"/>
  <many-to-one name="EndUser" ...... />
  <property name="Reason"/>
  <property name="AccessRight"/>
  <property name="AccessType"/>
  <bag name="CloseAccessCommands" cascade="all" lazy="false">
    <key column="OpenCommandId"/>
    <one-to-many class="xxx.TemporaryAccess.Commands.TemporaryAccessCloseCommand, xxx.TemporaryAccess"/>
  </bag>
</joined-subclass>
要检索没有成功的CloseAccessCommand的每个OpenAccessCommand,nhibernate查询是什么

我试过这个:

    public IList<TemporaryAccessOpenCommand> FindOpenCommandsWithoutSucceededCloseCommand()
    {
        return this.HibernateTemplate.ExecuteFind<TemporaryAccessOpenCommand>(delegate(ISession session)
        {
            return session.CreateCriteria(typeof(TemporaryAccessOpenCommand))
                .CreateCriteria("CloseAccessCommands")
                .Add(Expression.Not(Expression.Eq("Result.Status", CommandStatus.Succeeded)))
                .List<TemporaryAccessOpenCommand>();
        });
    }
但是它将返回一个OpenAccessCommand,当它应该返回一个空列表时,该命令有两个CloseCommand,一个失败,一个成功


谢谢你的帮助,请原谅我的英语不好

我设法用这种方式做了一些事情,如果这不是最好的方式,我愿意接受建议

public IList<TemporaryAccessOpenCommand> FindOpenCommandsWithoutSucceededCloseCommand()
    {
        return this.HibernateTemplate.ExecuteFind<TemporaryAccessOpenCommand>(delegate(ISession session)
        {
            string sql = string.Format(@"
                                         (
                                             SELECT temp_c.OpenCommandId
                                             FROM VSA2_Commands_TemporaryAccess_Close temp_c
                                                    INNER JOIN VSA2_Commands c 
                                                        ON temp_c.CommandId = c.Id
                                             WHERE c.ResultStatus = {0}
                                         ) AS OpenCommandId"

                                        , (int)CommandStatus.Succeeded);

            var subCriteria = DetachedCriteria.For<TemporaryAccessCloseCommand>();
            subCriteria = subCriteria.SetProjection(Projections.SqlProjection(sql, new string[] { "OpenCommandID" }, new IType[] { NHibernateUtil.Int32 }));


            return session.CreateCriteria(typeof(TemporaryAccessOpenCommand))
                .Add(Expression.Eq("Result.Status", CommandStatus.Succeeded))
                .Add(Subqueries.PropertyNotIn("Id", subCriteria))
                .List<TemporaryAccessOpenCommand>();
        });
    }