2011-12-11 12 views
2

私は今は分かりませんが、かなり単純な問題があるようです。制限を基にした選択列によるnhibernateグループ

私はそうのようなテーブルがあります:私は種類によってグループに必要な、最新の日付を持つ行を選択モデル

class MyClass 
    public virtual long Id { get; set;} 
    public virtual long Type { get; set;} 
    public virtual long Value { get; set;} 
    public virtual string comment { get; set;} 
    public virtual DateTime Date { get; set;} 

に基づいて

id | type | value | comment | date 
1  1  22  test  dec 2nd 
2  1  23  foo  dec 4th 
3  2  2  bar  dec 1st 

を。 (つまり、ID 2とID 3の行をフェッチします)。

誰かがこれを行う方法の説明を基準として提供できますか?

+0

私は行2と3を意味します。私はポストを更新します。 – Thomas

答えて

2

2回のラウンドトリップ、1は希望の行のタイプ/日付を取得し、1は各行を取得します。 FutureValue<>はループ内の各クエリを1つのラウンドトリップに結合し、選択はFutureValuesを実際の値に変換します。

class TypeDate 
{ 
    public long Type { get; set; } 
    public DateTime Date { get; set; } 
} 

var groups = session.CreateCriteria<MyClass>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("Type"), "Type") 
     .Add(Projections.Max("Date"), "Date")) 
    .SetResultTransForm(Transformers.AliasToBean<TypeDate>()); 
    .List<TypeDate>(); 

List<IFutureValue<MyClass>> futures = new List<IFutureValue<MyClass>>(groups.Count); 
foreach (var group in groups) 
{ 
    futures.Add(session.CreateCriteria<MyClass>() 
     .Add(Restrictions.Eq("Type", group.Type)) 
     .Add(Restrictions.Eq("Date", group.Date)) 
     .FutureValue<MyClass>()); 
} 

IEnumerable<MyClass> results = futures.Select(future => future.Value).ToList(); 
関連する問題