我有一张表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
值的正确方法是什么?
答案 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) });