2015-12-17 1 views
1

У меня проблема с моим запросом Nhibernate.Nhibernate Query Выберите только те, которые существуют в таблице Child в лизинге

Мой отображение XML

enter image description here

enter image description here

У меня есть 2 таблицы, TableA (KeyField1, Field2, Field3) и TableB (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

проверили свой профиль и обнаружили, что это должно помочь вам понять С.О. : [Что делать, если кто-то отвечает на мой вопрос?] (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

Уважаемый Radim Köhler, Finnaly Я нашел ответ, используя query.Add (Restrictions.Eq ("Field3 ", true)) .Add ()Subqueries.PropertyIn ( "ID", DetachedCriteria .Для () .SetProjection (Projections.Property ("TableA.ID")) ) ); – Veasna

+0

Замечательно, что мой ответ помог вам –

Смежные вопросы