如何在TimeSpan上运行NHibernate聚合?

时间:2017-10-18 10:06:09

标签: c# nhibernate

我有一张表Foo

create table Foo(
  FooId uniqueidentifier not null,
  UserId uniqueidentifier not null,
  TimeSpent bigint not null)

这映射到一个类:

public class Foo
{
  public Guid FooId {get; set;}
  public Guid UserId {get; set;}
  public TimeSpan TimeSpent {get; set;}
}

在NHibernate中ClassMap<Foo>

Id(x => x.FooId).Not.Nullable().GeneratedBy.GuidComb();
Map(x => x.UserId).Not.Nullable();
Map(x => x.TimeSpent).Not.Nullable();

到目前为止一切顺利。现在我想编写一个查询来获得每个用户TimeSpent的聚合。在理想的世界中,它将是:

return Session.Query<Foo>()
  .GroupBy(f => f.UserId)
  .Select(g => new { UserId = g.Key, TotalTimeSpent = g.Sum(f => f.TimeSpent) });

但是对于汇总TimeSpan值没有原生支持,所以我们可以说:

TotalTimeSpent = TimeSpan.FromMilliseconds(g.Sum(f => f.TimeSpent.TotalMilliseconds))

但是当然,NHibernate不知道这个TotalMilliseconds属性是什么,因为那纯粹是一个C#构造。

在NHibernate中聚合TimeSpan值的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

自己制定了一个可能的解决方案:

在课程中添加long字段:

public long TimeSpentTicks {get; set;}

添加映射:

Map(x => x.TimeSpentTicks).Column("TimeSpent").ReadOnly();

像这样聚合:

var result = Session.Query<Foo>()
 .GroupBy(f => f.UserId)
 .Select(g => new { UserId = g.Key, TotalTicks = g.Sum(f => f.TimeSpentTicks) })
 .ToList() // so we can convert to TimeSpan in managed code
 .Select(x => new { x.UserId, TotalTime = TimeSpan.FromTicks(x.TotalTicks) });