2015-12-17 78 views
1

我的Nhibernate查詢有問題。Nhibernate查詢僅選擇那些存在於第1個子表中的子表

我的XML映射

enter image description here

enter image description here

我有2個表,表A(KeyField1,字段2,字段3)和表B(KeyField1,的DateField)

TableA 
------------------ 
KeyField1 | Field2 | Field 3 
K1  | A1  | True 
K2  | A2  | True 
K3  | A3  | True 
K4  | A4  | False 





TableB 
------------------------------------------------------------- 
TableBID        | KeyField1 | DateField 
9CFA1E9F-7680-4715-BD5B-8DE674DB6EA6 | K1  | 12/17/2010 
11C8226E-AEF2-4042-AADD-BDDBA35D83D6 | K3  | 12/17/2010 
3971C949-673E-4FE5-B9B4-D73949F2FC53 | K3  | 12/21/2010 

我會喜歡這樣的結果

TableA 
------------------ 
KeyField1 | Field2 | Field 3 
K1  | A1  | True 
K3  | A3  | True 

表示我希望在TableA中擁有所有記錄,其中TableB中只有一個存在。

我也嘗試這種方式,但沒有成功

DetachedCriteria query = DetachedCriteria.For(typeof(TableA), "_request"); 
query.CreateAlias("TableB", "pl"); 
query.Add(
    Restrictions.And( 
     Restrictions.Eq("Field3", true), 
     Restrictions.Gt(Projections.Count("pl.ID") , 0) 
    ) 
); 

什麼建議嗎?

+0

經過您的個人資料,發現這應有助於您瞭解SO :[我應該怎麼做當有人回答我的問題?](http://stackoverflow.com/help/someone-answers) –

回答

0

我們可以使用子查詢和EXISTS聲明

TableA parent = null; 
TableB child = null; 

// parent query (TableA) 
// will be filtered by existing children 
// but still will be ready for paging 
var parentQuery = session.QueryOver<TableA>(() => parent) 
    .WithSubquery 
    .WhereExists(
     // subquery, where we assure that child exists for parent ID 
     QueryOver.Of<TableB>(() => child) 
      .Where(() => child.TableA.ID == parent.ID) 
      .Select(_ => child.ID) 
    ); 

// parents which fit to our needs 
IList<TableA> result = parentQuery 
    .Take(10) 
    .Skip(0) 
    .List<TableA>(); 

也就是說QueryOver語法和ICriteria將幾乎一樣的...

+0

親愛的RadimKöhler,Finnaly我找到了答案,通過使用query.Add(Restrictions.Eq(「Field3 「,是)) .Add( Subqueries.PropertyIn( 「ID」,的DetachedCriteria 。對於() .SetProjection(Projections.Property( 「TableA.ID」)) ) ); – Veasna

+0

很高興看到我的回答對您有所幫助 –

相關問題