【问题标题】:How Can I Generate Nhibernate GROUP BY without SELECT the property如何在不选择属性的情况下生成 Nhibernate GROUP BY
【发布时间】:2023-04-09 20:51:02
【问题描述】:

我想解决这个问题:

SELECT Max(Date)
FROM Table
GROUP BY SubId

(然后将其作为子查询传递给 mid-action,以便我可以获取表中项目的 Id)

SELECT Id
FROM Table
WHERE Date in
[[[ previous request ]]]

(然后通过其他表连接获取完整的表项)

SELECT *
FROM Table
LEFT JOIN...
WHERE Id in
[[[ previous request ]]]

我尝试过这种请求:

var subquery = QueryOver.Of<Table>(() => x)
                    .SelectList(list => list
                    .SelectMax(() => x.Date)
                    .SelectGroup(() => x.Sub.Id)
                );

                var filter = QueryOver.Of<Table>().WithSubquery.
                    WhereExists(subquery)
                    .Select(p => p.Id);

                var result = Session.QueryOver<Table>().WithSubquery.WhereProperty(p => p.Id).In(filter).Left.JoinQueryOver(p => p.Sub).List();

但问题是我无法仅凭请求中的日期就获得第一个请求。 有没有比那种子查询更好的方法呢?在 NHibernate 中是否有可能在不选择它的情况下按属性分组?

谢谢!

【问题讨论】:

标签: c# sql nhibernate fluent-nhibernate


【解决方案1】:

终于做到了,它生成了我想要的 SQL。但并不是 3 个子查询,而是 3 个查询一组数据(数组子查询和 CorrespondingIds)。

var subquery = Session.QueryOver<Table>(() => x)
                    .SelectList(list => list
                    .SelectMax(() => x.Date)
                    .SelectGroup(() => x.Sub.Id))
                    .List<object[]>().Select(p => p[0]).ToArray();


                var CorrespondingIds = Session.QueryOver<Table>(() => x)
                    .WhereRestrictionOn(() => x.Date).IsIn(subquery)
                    .Select(p => p.Id).List<int>().ToArray();

                var result = Session.QueryOver<Table>(() => x).WhereRestrictionOn(() => x.Id).IsIn(CorrespondingIds).Left.JoinQueryOver(p => p.Sub).List();

【讨论】:

  • 这是一个不错的解决方案!太棒了.. 享受 NHibernate
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多