我有一个看起来很简单的问题,我现在无法理解。
我有一张这样的表:
id | type | value | comment | date
1 1 22 test dec 2nd
2 1 23 foo dec 4th
3 2 2 bar dec 1st
基于模型
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为2且ID为3的行。)
有人可以提供标准,说明如何执行此操作吗?
答案 0 :(得分:2)
两次往返,1获取所需行的类型/日期,1组合获得每一行。 FutureValue<>
会将循环中的每个Query组合到一个往返中,select会将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();