按日期分组LINQ to NHibernate

时间:2009-10-20 08:35:01

标签: nhibernate linq-to-nhibernate

我在NHibernate的LINQ实现中遇到了一个不受支持的功能问题(它正在触发QueryException:“无法解析属性:CreatedOn.Date:Example.Comment”)。

鉴于下面的实体,我想通过对每天的评论进行分组来提取统计数据,并总结每天的评论量(当然它有其他属性和正确的映射,用Fluent NHibernate编写)

public class Comment
{
    public virtual DateTime CreatedOn
    {
        get;
        set;
    }
}

我的LINQ查询如下所示(如果针对LINQ to SQL上下文执行,查询工作正常)。

var commentsPerDay = (from c in session.Linq<Comment>()
                      group c by new { c.CreatedOn.Date } into g
                      select new
                      {
                          Date = g.Key.Date,
                          Count = g.Count()
                      };

正确的解决方案是为项目做出贡献并解决这个问题。

另一方面,我很想知道(LINQ to)NHibernate是否具有扩展点,我可以注入这种行为。我知道我可以创建一个自定义类型并将第二个属性映射到创建时的日期部分,但我猜这不会转换为查询,这会使它太慢。

我对重写查询的访问权限有限,因为它们仍然需要使用LINQ to SQL,所以我不能使用HQL。

2 个答案:

答案 0 :(得分:1)

嗯,这个问题是7年前发布的......所以我觉得自那以后发生了很多变化。

长话短说 - 你可以肯定地按照最新版本(NH的3.3)感觉自然的方式分组。我不确定是什么版本的NH引入了这个功能。 @Mike有旧版本的解决方案,但通过网络提取所有数据根本不具备性能。你现在可以将SomeDate.Date分组为Linq to NH。

var results = _session.Query<Appointment>()
    .Where(ts => ts.StartTime > model.StartDate && ts.StartTime < endDateTime)
    .GroupBy(ts => new { ts.Account, ts.Date })
    .Select(g => new { g.Key.Account, g.Key.Date, AppointmentCount = g.Count() });

答案 1 :(得分:0)

我只找到了一个解决方案,那就是执行以下操作:

从nhibernate中选择所有结果,然后强制它检索结果。然后,您可以根据结果执行分组。

看起来像是:

var comments = session.Linq<Comment>().Select(s=> new { s.CreatedOn } ).ToList(); //get all the comments into the results
var commentsPerDay = comments.GroupBy(c=>c.CreatedOn.Date).Select(foo => new {Date = g.Key, Count = g.Count());  //group by the results

对不起,我喜欢lamda,但我想你会明白的。您可能希望限制查询的日期范围,这样您就不会收回大量结果。

(我之前使用错误的用户登录谷歌。并在该用户下发布。)