1

我使用NHibernate 3.2,並具有以下型號:NHibernate的相關子查詢獲取單個項目

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; } 
} 

現在,我要查詢用戶與療法最新的日誌條目的日期。

class UserDto 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public DateTime? LastLogDate { 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 

回答

3

你可以做同樣的事情彙總查詢...

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>(); 

或子查詢.. 。

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>(); 
+0

謝謝,這在我的特例中有效。然而,如果我不需要Date屬性,而是另一個不能聚合的屬性,我可以做些什麼,例如一個整數列代表一個枚舉? 我想有一個更一般的方式來投影我的子查詢的最上面一行。 –

+0

當然,我會補充說,非常感謝 – dotjoe

+0

!這工作得很好! –