代码之家  ›  专栏  ›  技术社区  ›  Troels Thomsen

按日期与Linq to NHibernate分组

  •  4
  • Troels Thomsen  · 技术社区  · 15 年前

    我面临一个问题,在nhibernate的linq实现中有一个不受支持的特性(它正在触发一个 QueryException :“无法解析属性:createdon.date of: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 回复  |  直到 8 年前
        1
  •  0
  •   Mike    15 年前

    我只找到了一个解决方案,那就是:

    从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
    

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

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

        2
  •  1
  •   viggity    8 年前

    这个问题是7年前发布的…所以我觉得从那以后很多事情都变了。

    长话短说-你可以用最新版本(NH的3.3版)来确定约会的方式。我不确定NH的哪个版本引入了这个特性。@Mike有一个针对旧版本的解决方案,但是将所有的数据拉到线路上根本就没有性能。你可以分组 SomeDate.Date 现在和林肯一起去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() });