2011-07-22 41 views
0

FNH新手問題 -功能NHibernate - 過濾結果集

我有兩個對象RR和TT定義如下:

public class RR 
{ 
    Id 
    Name 
    TT_Id //corresponds to TT.Id 
} 

public class TT 
{ 
    Id 
    Name 
    Type 
} 

我想從RR篩選記錄下面的SQL按:

SELECT RR.* 
FROM RR 
LEFT OUTER JOIN TT ON RR.TT_Id = TT.Id 
WHERE TT.Type <> 7 

任何人都可以請指導如何添加過濾器標準,以達到上述NH。

謝謝!

回答

3

你爲什麼TT_Id,而不是TT本身RR? IMO會讓很多事情比需要更困難。

是否會參考TT然後

resultlist = session.CreateCriteria<RR>() 
    .CreateCriteria("TT") 
    .Add(Restrictions.Not(Restrictions.Eq("Type", 7))) 
    .List<RR>(); 

否則

var subquery = DetachedCriteria.For<TT>() 
    .Add(Restrictions.Not(Restrictions.Eq("Type", 7))) 
    .SetProjection(Projections.Id()); 

resultlist = session.CreateCriteria<RR>() 
    .Add(Subqueries.In("TT_id", subquery))) 
    .List<RR>(); 

IList<object[]> resultlist = session.CreateSqlQuery("SELECT RR.* FROM RR LEFT OUTER JOIN TT ON R.TT_Id = TT.Id WHERE TT.Type <> 7 ") 
    .List().Cast<object[]>(); 

// hydrate RR yourself here 
+0

FIRO您好,感謝您的答覆。那麼,我正在嘗試DetachedCriteria,因爲你有上面的建議,但得到這個錯誤: – iniki

+0

錯誤 - 無法從'NHibernate.Criterion.DetachedCriteria'轉換爲'對象[]'在這一行:criterions.Add(Restrictions.In(「 TT_id「,subQuery)); Herez我的代碼片段:IList criterions = new List (); criterions.Add(Restrictions.In(「TT_id」,subQuery)); IMul​​tiCriteria c = session.CreateMultiCriteria();應用策略 iniki

+0

@iniki抱歉複製粘貼錯誤編輯**限制**到**子查詢** – Firo