2017-10-18 301 views
0

我有一个表Foo如何在TimeSpan上运行NHibernate聚合?

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

摸索出一个可能的解决方案我:

一个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) });