2010-05-06 2 views
6

Я пытаюсь построить запрос в NHibernate, чтобы вернуть список клиентов без заказов, соответствующих определенным критериям.Запрос Nhibernate и не существует

Мой объект Customer содержит набор заказов:

<set name="Orders"> 
    <key column="CustomerID" /> 
    <one-to-many class="Order" /> 
</set> 

Как contruct запрос с помощью NHibernate в ICriteria API, чтобы получить список всех клиентов, которые не имеют заказов? С помощью встроенного SQL, я могу представить запрос, как это:

select * from tblCustomers c where not exists 
    (select 1 from tblOrders o where c.ID = o.CustomerID) 

Я был не в состоянии понять, как это сделать, используя псевдонимы и объекты DetatchedCriteria. Любое руководство будет оценено!

Спасибо!

ответ

7

это было бы перевести на этот SQL ...

session.CreateCriteria<Customer>("c") 
    .Add(Subqueries.NotExists(
     DetachedCriteria.For<Order>("o") 
     .SetProjection(Projections.Constant(1)) 
     .Add(Restrictions.PropertyEq("c.ID", "o.Customer.ID")) 
     //Add more order restricitions here 
    )) 
    .List<Customer>(); 

если вы хотите только клиентов без заказов вы можете также использовать Restrictions.IsEmpty(), чтобы сделать то же самое, что и выше.

session.CreateCriteria<Customer>() 
    .Add(Restrictions.IsEmpty("Orders")) 
    .List<Customer>() 
+0

Спасибо, я думаю, это поможет мне начать. Будет ли NHibernate жаловаться на использование o.CustomerID ... этот столбец находится в БД, но не отображается как столбец в моем классе Order. (NHibernate добавила его автоматически, как указано в наборе Клиента как ключевой столбец.) – Dan

+0

oh..thth's right, это должно быть 'o.Customer.ID' – dotjoe

+0

. У обоих ресурсов нужно сопоставлять друг другу, чтобы все работало ? Потому что в настоящее время я не могу войти в утверждение, даже intellisense не выделяет его. –

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