2017-10-18 300 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) });