2013-01-15 97 views
2

我有以下型號:問題與NHibernate QueryOver和子查詢

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Username { get; set; } 
    public virtual string Password { get; set; } 
    public virtual string Email { get; set; } 
    public IList<SubmissionNote> Notes { get;set; } 
} 

public class SubmissionNote 
{ 
    public virtual Int64 Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual DateTime CreatedOn { get; set; } 
    public virtual User Creator { get; set; } 
    public virtual Submission BelongsTo { get; set; } 
} 

public class Submission 
{ 
    public virtual Int64 Id { get; set; } 
    public virtual DateTime HappenedOn { get; set; } 
    public virtual int StatusCode { get; set; } 
} 

我想編寫一個將所有其最後一個音符被一些用戶或用戶的列表中輸入的提交查詢(通過鑑定他們的名字)。我將不勝感激您使用NHibernate QueryOver API構建此查詢的幫助。我已經能夠創建一個查詢,使所有的音符最後如下:

SubmissionNote alias = null; 
var lastNote = session.QueryOver<SubmissionNote>() 
    .SelectList(list => list. 
     SelectGroup(x => x.BelongsTo).WithAlias(() => alias.BelongsTo). 
     SelectMax(x => x.CreatedOn).WithAlias(() => alias.CreatedOn). 
     Select(x => x.Creator).WithAlias(() => alias.Creator). 
     Select(x => x.Id).WithAlias(() => alias.Id). 
     Select(x => x.Text).WithAlias(() => alias.Text)) 
    .TransformUsing(Transformers.AliasToBean<SubmissionNote>()) 
    .List(); 

我可以使用指定查詢作爲子查詢來產生所需要的結果呢?或者你建議另一種解決方案?

回答

3

我會嘗試這樣一個子查詢(儘管未測試)

SubmissionNote subNoteAlias = null, subNoteAliasMax =null; 
User userAlias = null; 
String[] userNames = new[]{"John","Joe"}; 

var subquery = 
    QueryOver.Of(() => subNoteAliasMax) 
     .Where(subNote => subNote.BelongsTo.Id == subNoteAlias.BelongsTo.Id) 
     .Select(Projections.Max<SubmissionNote>(subNote => subNote.CreatedOn)); 

var result = session 
.QueryOver<SubmissionNote>(() => subNoteAlias) 
.WithSubquery.WhereProperty(subNote=>subNote.CreatedOn).Eq(subquery) 
.JoinQueryOver(
     subNote=>subNote.Creator 
     ,()=>userAlias 
     ,JoinType.InnerJoin 
     ,Restrictions.In(Projections.Property(() => userAlias.Username), userNames)) 
    .List(); 

生成的SQL查詢將(非常)大致是這樣的:

SELECT SubmissionNote.* 
    FROM SubmissionNote INNER JOIN User 
    ON SubmissionNote.creatorId = User.userId 
    AND User.userName in ('john','joe') 
    WHERE SubmissionNote.CreatedOn = (SELECT MAX(CreatedOn) FROM SubmissionNote snAlias  
    WHERE snAlias.SubmissionId = SubmissionNote.SubmissionId) 

希望這會有所幫助。子查詢可能會返回一個日期而不是一個id。 LMK和我會看看。

+0

我試過查詢,它似乎工作。我對你的查詢感到不知所措,因爲我的直覺告訴我,我將不得不使用一組來完成我的任務。你能解釋一下你的查詢邏輯嗎? – Ikaso

+1

@Ikaso我用生成的SQL查詢的草圖更新了我的答案。也許你可以用一箇中間的DTO來獲得相同的結果來存儲組的結果。我會對答案感興趣 – jbl