【问题标题】:NHibernate Criteria Query: deal with partitionsNHibernate Criteria Query:处理分区
【发布时间】:2013-03-01 22:27:18
【问题描述】:

我刚开始学习 NHibernate Criteria 查询。现在进入这个连接表和分区问题。

背景:

1.两个对象模型:

项目、用户

2.模型属性:

项目:

  • ID(整数)
  • UpdateDate(日期时间)
  • 状态(字符串)
  • 用户(用户)

用户:

  • ID(整数)
  • 名称(字符串)

3.关系

用户一次更新一个项目,每次更新后,将使用当前的UpdateDate、Status、User创建一个新的项目实例。

我想做的事:

  1. 按 User.ID 对项目进行分组

  2. 按更新日期排序

  3. 从1&2获取每个Group的第一条记录

  4. 检查此项目的状态是否!=“已删除”

  5. 如果4次通过,则将此项目放入结果列表中

问题:

  1. 我现在只能使用 Criteria
  2. 我知道如何进行简单的查询,例如:

    ICriteria projectCriteria = Session.CreateCriteria();

    projectCriteria.Add(Restrictions.Not("Status", "Deleted"));

    projectCriteria.AddOrder(Order.Desc("UpdateDate"));

但很难使用 Criteria API 进行分区和表连接。

想知道是否有人知道如何做到这一点可以帮助我。

谢谢!

我在数据库中尝试的 SQL 查询:

WITH PartitionProject AS 
(
    SELECT   *, ROW_NUMBER() OVER(PARTITION BY UserFk ORDER BY UpdateDate DESC) AS RowNumber
    FROM     Projects
)
SELECT * 
FROM PartitionProject 
WHERE RowNumber = 1 and (ProjectStatus != 'Deleted')

【问题讨论】:

  • 如果您编写要翻译的 sql 查询,我可以提供一个示例
  • SQL 已添加。感谢您的关注。

标签: c# sql nhibernate nhibernate-criteria


【解决方案1】:

我认为 Nhibernate 不支持 Row_Number() 分区但你可以使用Projections.SqlProjection

您可以通过 2 个不同的步骤处理您的查询:

使用返回对象列表的 Projections.SqlProjection 对 db 进行第一步查询

第二步迭代该列表以提取您需要的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多