按日期分组,LINQ至NHibernate

按日期分组,LINQ至NHibernate,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我在NHibernate的LINQ实现中遇到了一个功能不受支持的问题(它触发了一个QueryException:“无法解析属性:CreatedOn.Date of:Example.Comment”) 考虑到下面的实体,我想通过对每天的评论进行分组来提取统计数据,并总结每天的评论数量(当然,它有额外的属性和正确的映射,用Fluent NHibernate编写): 我的LINQ查询如下所示(如果针对LINQ到SQL上下文执行查询,则查询工作正常) var commentsPerDay=(来自sess

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

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

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

var commentsPerDay=(来自session.Linq()中的c)
将新的{c.CreatedOn.Date}分组到g中
选择新的
{
日期=g.Key.Date,
Count=g.Count()
};
正确的解决方案是为项目做出贡献并解决此问题

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


我重写查询的权限有限,因为它们仍然必须使用LINQ to SQL,所以我不能使用HQL。

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

从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
var comments=session.Linq().Select(s=>new{s.CreatedOn}).ToList();//将所有注释放入结果中
var commentsPerDay=comments.GroupBy(c=>c.CreatedOn.Date)。选择(foo=>new{Date=g.Key,Count=g.Count());//按结果分组
对不起,我喜欢lamda,但我想你会明白的。你可能想限制查询的日期范围,这样你就不会返回大量的结果


(我以前是用错误的用户登录到谷歌的。然后在该用户下发布的。)

好吧,这个问题是7年前发布的……所以我认为从那时起有了很大的变化

长话短说-最新版本(NH的3.3版)可以让你以自然的方式分组约会当然可以。我不确定NH的哪个版本引入了此功能。@Mike对旧版本有一个解决方案,但将所有数据通过网络传输根本没有效果。您可以在
SomeDate.Date
上分组,现在Linq到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() });
var results=\u session.Query()
.Where(ts=>ts.StartTime>model.StartDate&&ts.StartTimenew{ts.Account,ts.Date})
.Select(g=>new{g.Key.Account,g.Key.Date,AppointmentCount=g.Count()});

否则,您必须添加另一个属性(恶心)。这不会执行,但因为没有其他人提出更好的解决方案,所以您将是被选中的人。是的,性能会很差,因为查询将针对所有记录转到数据库,因为它不会从日期时间中删除分组依据的时间。所以我想这归结为,您需要多少额外的属性和数据库列想要vs返回一堆行来计算数字。在
中选择(…)
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
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() });