获取单个项的NHibernate相关子查询

获取单个项的NHibernate相关子查询,nhibernate,linq-to-nhibernate,queryover,Nhibernate,Linq To Nhibernate,Queryover,我使用的是NHibernate 3.2,具有以下模型: class User { public virtual int Id { get; set; } public virtual string Username { get; set; } public virtual IList<Log> Logs { get; set; } } class Log { public virtual int Id { get; set; } public

我使用的是NHibernate 3.2,具有以下模型:

class User
{
    public virtual int Id { get; set; }
    public virtual string Username { get; set; }
    public virtual IList<Log> Logs { get; set; }
}

class Log
{
    public virtual int Id { get; set; }
    public virtual User User { get; set; }
    public virtual DateTime Date { get; set; }
}


使用NHibernate QueryOver或Linq执行此查询的最有效方法是什么?

这是我要提示的SQL查询:

SELECT u.Id as UserId,
       u.Username as Username,
       (SELECT TOP 1 l.Date
        FROM   [Userlog] l
        WHERE  l.User_id = u.Id) as LastLogDate
FROM   [User] u

您可以对聚合查询执行相同的操作

Log logAlias = null;
UserDto dto = null;

Session.QueryOver<User>()
    .Left.JoinAlias(x => x.Logs, () => logAlias)
    .SelectList(list => list
        .SelectGroup(x => x.Id).WithAlias(() => dto.UserId)
        .SelectGroup(x => x.Username).WithAlias(() => dto.Username)
        .SelectMax(() => logAlias.Date).WithAlias(() => dto.LastLogDate))
    .TransformUsing(Transformers.AliasToBean<UserDTO>()
    .List<UserDTO>();
Log logAlias=null;
UserDto-dto=null;
Session.QueryOver()
.Left.JoinAlias(x=>x.Logs,()=>logAlias)
.SelectList(list=>list
.SelectGroup(x=>x.Id)。带别名(()=>dto.UserId)
.SelectGroup(x=>x.Username)。带别名(()=>dto.Username)
.SelectMax(()=>logAlias.Date)。使用别名(()=>dto.LastLogDate))
.TransformUsing(Transformers.AliasToBean()
.List();
或者使用子查询

User userAlias = null;
UserDto dto = null;

Session.QueryOver<User>(() => userAlias)
    .SelectList(list => list
        .Select(x => x.Id).WithAlias(() => dto.UserId)
        .Select(x => x.Username).WithAlias(() => dto.Username)
        .SelectSubQuery(QueryOver.Of<Log>()
            .Where(x => x.User.Id == userAlias.Id)
            .OrderBy(x => x.Date).Desc
            .Select(x => x.Date)
            .Take(1)).WithAlias(() => dto.LastLogDate))
    .TransformUsing(Transformers.AliasToBean<UserDTO>()
    .List<UserDTO>();
User userAlias=null;
UserDto-dto=null;
Session.QueryOver(()=>userAlias)
.SelectList(list=>list
.Select(x=>x.Id).WithAlias(()=>dto.UserId)
.Select(x=>x.Username).WithAlias(()=>dto.Username)
.SelectSubQuery(QueryOver.Of())
.Where(x=>x.User.Id==userAlias.Id)
.OrderBy(x=>x.Date).Desc
.选择(x=>x.Date)
.Take(1)).WithAlias(()=>dto.LastLogDate))
.TransformUsing(Transformers.AliasToBean()
.List();

谢谢,这适用于我的特定示例。但是,如果我不需要Date属性,而需要另一个无法聚合的属性,例如代表枚举的整数列,我该怎么办?我希望有一种更通用的方法来投影子查询的最顶层行。当然,我会将其添加到答案中
User userAlias = null;
UserDto dto = null;

Session.QueryOver<User>(() => userAlias)
    .SelectList(list => list
        .Select(x => x.Id).WithAlias(() => dto.UserId)
        .Select(x => x.Username).WithAlias(() => dto.Username)
        .SelectSubQuery(QueryOver.Of<Log>()
            .Where(x => x.User.Id == userAlias.Id)
            .OrderBy(x => x.Date).Desc
            .Select(x => x.Date)
            .Take(1)).WithAlias(() => dto.LastLogDate))
    .TransformUsing(Transformers.AliasToBean<UserDTO>()
    .List<UserDTO>();