2011-12-11 3 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, 각 행을 얻으려면 1을 조합하십시오. FutureValue<>은 루프의 각 쿼리를 왕복으로 결합하고 선택은 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(); 
관련 문제