2017-10-18 4 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#の構造であるためです。

TimeSpanの値をNHibernateで集計する正しい方法は何ですか?

答えて

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) }); 
関連する問題