4

我在 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。

4

2 回答 2

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() });
于 2016-04-12T18:42:06.663 回答
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,但我想你会明白的。您可能希望限制要查询的日期范围,以免退回大量结果。

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

于 2009-11-20T01:57:22.547 回答