gpt4 book ai didi

sql - SQL 中的统计查询 - NHibernate LINQ 有可能吗?

转载 作者:行者123 更新时间:2023-12-04 08:53:29 26 4
gpt4 key购买 nike

我有一个应用程序,它使用一些数据仓库原则(例如维度建模)对一个相当简单的数据库进行报告。

一个名为 Call 的示例(简化)实体如下所示:

    public virtual long Id { get; set; }
public virtual string OriginatorNumber { get; set; }
public virtual string DestinationNumber { get; set; }
public virtual DateDimension DateDimension { get; set; }

实际模型的一些属性已被删除,因为它们无关紧要。简化的 DateDimension 如下所示:
    public virtual long Id { get; set; }
public virtual DateTime Date { get; set; }
public virtual int DayOfMonth { get; set; }
public virtual int Weekday { get; set; }

像这样的列还有很多——它们是通过应用程序设置在当前十年中预先填充的。因此,整个十年中的每个日期在此表中都有一行,每个 Call 都有一个指向它发生日期的链接。这一切都在 Fluent NHibernate 中映射并且工作正常。

如果我想做一些报告,我可以使用 3.0 中改进的 NHibernate LINQ 提供程序轻松完成。我们希望使用 LINQ 来提高它为我们提供的可维护性,但如果我们真的必须,我们会考虑 HQL、ICriteria 甚至是普通 SQL。

所以说我想建立一个报告,显示来自某个号码的调用数量,除以它们发生的星期几。我可以通过这种方式轻松做到这一点:
        var query = Calls
.Where(c => c.OriginatorNumber == "402")
.GroupBy(c => c.DateDimension.Weekday)
.Select(g => new { Day = g.Key, Calls = g.Count() } );

在此示例中,“Calls”基本上是通过存储库接口(interface)从 NHibernates LINQ 提供程序(查询)返回的 IQueryable。上面的查询给了我正确的结果,NHibernate Profiler 告诉我 SQL 非常优化,一切都很好。

但是,如果我想做一些更高级的事情,我会卡住。假设我想要每个工作日的平均通话次数。离上面不远了,对吧?我只需要计算结果集中每个工作日的唯一日期数,然后除以调用总数,我们就都准备好了 - 对吧?好吧,不,这是我开始触及 NHibernate LINQ 提供程序的限制的地方。使用 LINQ to objects 我可以构造一个查询来完成它 - 类似于
.Select(g => g.Count() / g.GroupBy(c => c.DateDimension.Date).Count());

但是,当在 NHibernate 中使用它时,这不会转换为正确的查询。相反,它将上述两个 .Count() 调用转换为相同的调用记录计数 (*),因此结果始终为 1。

我当然可以将每个调用、工作日和日期作为一个新的匿名对象进行查询,然后在应用程序端进行数学运算,但根据传统观点,这是错误的 (tm)。我最终可能会在绝望中这样做,即使当 table 增长到一百万++调用时,这也意味着痛苦。

下面是一个 SQL 查询,它给出了我正在寻找的结果。
select ss.Weekday, AVG(cast(ss.Count as decimal))
from
(
select dd.Weekday, dd.Date, COUNT(*) as Count
from Call c
left outer join DateDimension dd
on c.DateDimension_id = dd.Id
where c.OriginatorNumber = '402'
group by dd.Weekday, dd.Date
) ss
group by ss.Weekday
order by ss.Weekday

是否可以使用 NHibernate LINQ 提供程序来做到这一点?或者,如果这是不可能的,在我必须让应用程序获取中间结果并完成剩下的工作之前,我能走多远?

最佳答案

使用 LINQ 提供程序无法完成很多事情。使用 HQL 或 CreateCriteria 只是您必须接受 NHibernate 的东西。

我没有尝试过,但看起来你应该能够使用 HQL 或 CreateCriteria(使用 DetatchedCriteria)做你想做的事情。

如果您不顾一切,您也可以使用 CreateSqlQuery 退回到纯 SQL。

关于sql - SQL 中的统计查询 - NHibernate LINQ 有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com