nhibernate和;不在「;在聚合子查询中

nhibernate和;不在「;在聚合子查询中,nhibernate,subquery,criteria,Nhibernate,Subquery,Criteria,我有一个实体提醒,它包含一组提醒时间表。 这是我的映射: <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Reminder" table="Reminders"> <id name="Code" type="System.Guid"> <column name="ReminderCode" /> <generator class="gui

我有一个实体提醒,它包含一组提醒时间表。 这是我的映射:

<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Reminder" table="Reminders">
    <id name="Code" type="System.Guid">
        <column name="ReminderCode" />
        <generator class="guid.comb" />
    </id>
    ...
    <set access="field.pascalcase-underscore" cascade="all-delete-orphan" inverse="true" lazy="false" name="Schedules" mutable="true">
      <key foreign-key="FK_Schedules_Reminders">
        <column name="ReminderCode" />
      </key>
      <one-to-many class="ReminderSchedule" />
    </set>
</class>
但我不知道如何将其翻译成对nhibernate有效的标准


有人能帮我吗?非常感谢。

您可以通过使用 在HQL中,它应该是(未经测试的):


尽管我不相信我能准确地找到您需要的,但提供的链接应该能帮助您找到正确的方向。

由于我无法使用两个子查询(嵌套),我尝试仅使用一个子查询来简化。
我已经获取了已关闭时间表的提醒id(Schedules.rementer.Code)。幸运的是,如果前一个日程表还没有结束,我就不会有另一个日程表了。如果真的发生了,太糟糕了,我将无法管理它

这是我能做的最好的:

ICriteria FiltersCriteria = Session.CreateCriteria<Domain.Reminder>("Reminders");

DetachedCriteria dCriteria = DetachedCriteria.For<Domain.ReminderSchedule>("Schedules")
    .SetProjection(Projections.ProjectionList()
    .Add(Projections.GroupProperty("Schedules.Reminder.Code")))
    // .Add(Projections.Max("Schedules.NextSchedule").As("MaxSchedule")))
    .Add(Restrictions.Eq("Schedules.Closed", true));

FiltersCriteria.Add(Subqueries.PropertyIn("Reminders.Code", dCriteria));  
ICriteria FiltersCriteria=Session.CreateCriteria(“提醒”);
DetachedCriteria=DetachedCriteria.For(“附表”)
.SetProjection(Projections.ProjectionList()项目)
.Add(projects.GroupProperty(“Schedules.rementer.Code”))
//.Add(projects.Max(“Schedules.NextSchedule”).As(“MaxSchedule”))
.添加(限制。等式(“附表。关闭”,真));
添加(subquerys.PropertyIn(“rementers.Code”,dCriteria));
我想这个示例代码是不言自明的。

我在子查询中使用了一个DetachedCriteria,并将其用作我的条件的参数

@sjonny:谢谢你的回答。我希望找到一些非HQL的东西。@LeftyX:基本上,任何可以用HQL编写的东西都可以作为标准编写;这只是有点不那么直观(至少在我看来)。关于查询API-AFAIK,它还没有涵盖所有内容,不确定它是否适用于您的情况。@Sjonny:是的,我可以理解。HQL更简单,但我使用了条件,希望我能做所有事情。事实上,我差不多做到了。我不得不稍微简化我的查询,但我已经实现了我想要的(几乎).我很快会发布我的解决方案。@LeftyX:你当然可以。正如我所说的-AFAIK标准等同于HQL,所以可以在HQL中编写的任何内容都可以在标准中编写。我自己并不是标准方面最伟大的专家(我更喜欢尽可能使用Linq),但如果你愿意,我可以尝试一下这个问题。让我知道你进展如何。@Sjonny:谢谢。我明天会编一些代码。我在网上找到了不同的例子,并把它们放在一起。这是nhibernate版本2还是3?@Rippo:我使用的是NH3.0.0.4000。
SELECT * FROM Reminders
WHERE ReminderCode 
    NOT IN (
        SELECT LastReschedule.ReminderCode FROM (
        SELECT ReminderCode, MAX(NextSchedule) MaxSchedule
        FROM ReminderSchedules
        WHERE Closed = 1 
        GROUP BY ReminderCode) LastReschedule
        )
ORDER BY Reminders.ReminderCode
from Reminders as R
where R.ReminderCode not in
   ( select RS.ReminderCode
     from ReminderSchedules as RS
     where RS.NextSchedule = (select max(NextSchedule) from ReminderSchedules as Inner where RS.Closed = 1)
   )
ICriteria FiltersCriteria = Session.CreateCriteria<Domain.Reminder>("Reminders");

DetachedCriteria dCriteria = DetachedCriteria.For<Domain.ReminderSchedule>("Schedules")
    .SetProjection(Projections.ProjectionList()
    .Add(Projections.GroupProperty("Schedules.Reminder.Code")))
    // .Add(Projections.Max("Schedules.NextSchedule").As("MaxSchedule")))
    .Add(Restrictions.Eq("Schedules.Closed", true));

FiltersCriteria.Add(Subqueries.PropertyIn("Reminders.Code", dCriteria));