使用nHibernate QueryOver来加入一个子集

埃里克·艾伦

我正在使用nHibernate进行数据库访问。我需要执行一个复杂的查询,以查找在某个日期之后为每个成员设置的具有特定值PreviousId的所有成员日记帐分录。我可以轻松地为其编写SQL:

SELECT J.MemberId, J.PreviousId
FROM tblMemMemberStatusJournal J 
INNER JOIN (
    SELECT MemberId,
        MIN(EffectiveDate) AS EffectiveDate
    FROM tblMemMemberStatusJournal 
    WHERE EffectiveDate > @StartOfMonth
        AND (PreviousId is NOT null)
    GROUP BY MemberId
) AS X ON (X.EffectiveDate = J.EffectiveDate AND X.MemberId = J.MemberId)

但是,在尝试使nHibernate生成此信息时遇到了很多麻烦。关于如何使用QueryOver的文档并不多。

我曾经在其他地方看到过信息,但是这些信息都不是很清楚,也很少有关于为什么以某些方式完成事情的实际解释。使用Critieria API在NHibernate中选择子查询的答案并未给出有关其功能的充分示例,因此我无法复制它。

我已经获得了使用此命令创建的查询的内部:

IList<object[]> result = session.QueryOver<MemberStatusJournal>()
        .SelectList(list => list
            .SelectGroup(a => a.Member.ID)
            .SelectMin(a => a.EffectiveDate))
        .Where(j => (j.EffectiveDate > firstOfMonth) && (j.PreviousId != null))
        .List<object[]>();

根据分析器,它使此SQL:

SELECT this_.MemberId           as y0_,
   min(this_.EffectiveDate) as y1_
FROM   tblMemMemberStatusJournal this_
WHERE  (this_.EffectiveDate > '2014-08-01T00:00:00' /* @p0 */
    and not (this_.PreviousLocalId is null))
GROUP  BY this_.MemberId

但是我没有找到一个很好的例子来说明如何实际将这个子集与父查询结合在一起。有没有人有什么建议?

安德鲁·谢泼德

您实际上不是在子集上加入,而是在子集上进行过滤。知道了这一点,您可以选择通过其他方式(在这种情况下为相关子查询)进行过滤。

下面的解决方案首先创建一个分离的查询以充当内部子查询。我们可以通过使用别名将内部查询的属性与外部查询的属性相关联。

MemberStatusJournal memberStatusJournalAlias = null; // This will represent the 
                                                     // object of the outer query

var subQuery = QueryOver.Of<MemberStatusJournal>()
                  .Select(Projections.GroupProperty(Projections.Property<MemberStatusJournal>(m => m.Member.ID)))
                  .Where(j => (j.EffectiveDate > firstOfMonth) && (j.PreviousId != null))
                  .Where(Restrictions.EqProperty(
                             Projections.Min<MemberStatusJournal>(j => j.EffectiveDate),
                             Projections.Property(() => memberStatusJournalAlias.EffectiveDate)
                         )
                        )
                  .Where(Restrictions.EqProperty(
                            Projections.GroupProperty(Projections.Property<MemberStatusJournal>(m => m.Member.Id)),
                            Projections.Property(() => memberStatusJournalAlias.Member.Id)
                       ));

var results = session.QueryOver<MemberStatusJournal>(() => memberStatusJournalAlias)
                     .WithSubquery
                     .WhereExists(subQuery)
                     .List();

这将产生如下的SQL查询:

SELECT blah
FROM tblMemMemberStatusJournal J 
WHERE EXISTS (
    SELECT J2.MemberId
     FROM tblMemberStatusJournal J2
    WHERE J2.EffectiveDate > @StartOfMonth
        AND (J2.PreviousId is NOT null)
    GROUP BY J2.MemberId
    HAVING MIN(J2.EffectiveDate) = J.EffectiveDate
    AND J2.MemberId = J.MemberId
)

这看起来比inner join打开问题查询效率低但是我的经验是,SQL查询优化器足够聪明,可以将其转换为内部联接。如果要确认这一点,则可以使用SQL Studio生成并比较两个查询的执行计划。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NHibernate OR使用QueryOver

来自分类Dev

在NHibernate的queryover中使用OR子句

来自分类Dev

NHibernate 使用 QueryOver 和 Future 左加入两个集合

来自分类Dev

使用dplyr将值从所选子集的一个子集复制到所有其他子集

来自分类Dev

多列查询-使用QueryOver的Nhibernate

来自分类Dev

Nhibernate QueryOver 如何使此查询使用异步?

来自分类Dev

使用返回子集向量值来子集R中的另一个向量

来自分类Dev

使用另一个子集数据框删除行

来自分类Dev

NHibernate QueryOver将一个属性合并到另一个属性

来自分类Dev

如何设置一个 bitbake/Yocto 配方以仅使用 boost 库的一个子集?

来自分类Dev

使用NHibernate和Automapper来获取数据

来自分类Dev

NHibernate左加入一个无关实体

来自分类Dev

在仅一个子级上使用引导程序订单类来操纵订单

来自分类Dev

带子查询的Nhibernate Queryover获得下一个免费号码

来自分类Dev

NHibernate AliasToBean转换器抛出异常,则QueryOver别名是一个私有字段

来自分类Dev

NHibernate Join Query 只有一个 QueryOver 实例并且没有定义映射关系

来自分类Dev

如何仅使用关联表的一个匹配行来加入父级

来自分类Dev

iOS,仅对应用功能的一个子集使用生物识别身份验证

来自分类Dev

在Nhibernate QueryOver中使用计算的属性(未映射)

来自分类Dev

NHibernate QueryOver使用投影将父对象填充属性对象

来自分类Dev

NHibernate。QueryOver Take(n)-使用Left.Join

来自分类Dev

NHibernate:如何在Session.QueryOver中使用ExpandoResultTransformer

来自分类Dev

流利的NHibernate QueryOver:避免使用orderby空引用表

来自分类Dev

如何使用to_char()在nhibernate queryover中进行条件连接?

来自分类Dev

使用* OR *和* AND *子句的带有左联接的nHibernate QueryOver

来自分类Dev

NHibernate QueryOver-执行获取和订购->使用什么语法?

来自分类Dev

如何使用Nhibernate QueryOver调用Oracle的regexp_like函数?

来自分类Dev

NHibernate。QueryOver Take(n)-使用Left.Join

来自分类Dev

使用* OR *和* AND *子句的带有左联接的nHibernate QueryOver

Related 相关文章

  1. 1

    NHibernate OR使用QueryOver

  2. 2

    在NHibernate的queryover中使用OR子句

  3. 3

    NHibernate 使用 QueryOver 和 Future 左加入两个集合

  4. 4

    使用dplyr将值从所选子集的一个子集复制到所有其他子集

  5. 5

    多列查询-使用QueryOver的Nhibernate

  6. 6

    Nhibernate QueryOver 如何使此查询使用异步?

  7. 7

    使用返回子集向量值来子集R中的另一个向量

  8. 8

    使用另一个子集数据框删除行

  9. 9

    NHibernate QueryOver将一个属性合并到另一个属性

  10. 10

    如何设置一个 bitbake/Yocto 配方以仅使用 boost 库的一个子集?

  11. 11

    使用NHibernate和Automapper来获取数据

  12. 12

    NHibernate左加入一个无关实体

  13. 13

    在仅一个子级上使用引导程序订单类来操纵订单

  14. 14

    带子查询的Nhibernate Queryover获得下一个免费号码

  15. 15

    NHibernate AliasToBean转换器抛出异常,则QueryOver别名是一个私有字段

  16. 16

    NHibernate Join Query 只有一个 QueryOver 实例并且没有定义映射关系

  17. 17

    如何仅使用关联表的一个匹配行来加入父级

  18. 18

    iOS,仅对应用功能的一个子集使用生物识别身份验证

  19. 19

    在Nhibernate QueryOver中使用计算的属性(未映射)

  20. 20

    NHibernate QueryOver使用投影将父对象填充属性对象

  21. 21

    NHibernate。QueryOver Take(n)-使用Left.Join

  22. 22

    NHibernate:如何在Session.QueryOver中使用ExpandoResultTransformer

  23. 23

    流利的NHibernate QueryOver:避免使用orderby空引用表

  24. 24

    如何使用to_char()在nhibernate queryover中进行条件连接?

  25. 25

    使用* OR *和* AND *子句的带有左联接的nHibernate QueryOver

  26. 26

    NHibernate QueryOver-执行获取和订购->使用什么语法?

  27. 27

    如何使用Nhibernate QueryOver调用Oracle的regexp_like函数?

  28. 28

    NHibernate。QueryOver Take(n)-使用Left.Join

  29. 29

    使用* OR *和* AND *子句的带有左联接的nHibernate QueryOver

热门标签

归档