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

标签 sql linq nhibernate linq-to-nhibernate

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

一个名为 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/

相关文章:

c# - Linq 日期区分为字符串 yyyy-mm-dd

.net - 为每个域对象创建一个接口(interface)是个好主意吗?

nhibernate - 优势数据库 ORM 工具或代码生成器工具

php - 从数据库表构建 php 嵌套列表

mysql - 从右表条件获取左表行

sql - 处理大表 - 如何逐页选择记录?

linq - RavenDB:从多个博客索引博客文章标签

mysql - 如何在SQL中获取2个表中所有记录的AVG

c# - 是否有返回索引的 Linq 函数?

nhibernate - SQL.Data.Sqlite 版本与 NHibernate 2.1