2010-05-06 51 views
6

Tôi đang cố gắng tạo truy vấn trong NHibernate để trả về danh sách khách hàng không có đơn đặt hàng nào phù hợp với tiêu chí cụ thể.Truy vấn Nhibernate và không tồn tại

đối tượng khách hàng của tôi có chứa một tập hợp các đơn đặt hàng:

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

Làm thế nào để contruct một truy vấn sử dụng ICriteria API NHibernate để có được một danh sách của tất cả các khách hàng không có đơn đặt hàng? Sử dụng SQL nguyên gốc, tôi có thể trình bày truy vấn như sau:

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

Tôi không thể tìm ra cách thực hiện điều này bằng cách sử dụng bí danh và đối tượng DetatchedCriteria. Bất kỳ hướng dẫn nào cũng sẽ được đánh giá cao!

Cảm ơn!

Trả lời

7

này sẽ dịch để sql mà ...

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>(); 

nếu bạn chỉ muốn khách hàng không có đơn đặt hàng bạn cũng có thể sử dụng Restrictions.IsEmpty() để làm điều tương tự như trên.

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

Cảm ơn, tôi nghĩ điều này sẽ giúp tôi bắt đầu. NHibernate sẽ phàn nàn về việc sử dụng o.CustomerID ... cột đó nằm trong DB nhưng không được ánh xạ như một cột trong lớp Order của tôi. (NHibernate thêm nó tự động như quy định trong thiết lập của khách hàng như là cột quan trọng.) – Dan

+0

oh..đó là đúng, nó cần phải được 'o.Customer.ID' – dotjoe

+0

Cả hai entitties phải được ánh xạ với nhau để làm cho tất cả mọi thứ làm việc ? Cuz hiện tại tôi không thể nhập câu lệnh, kể cả intellisense cũng không làm nổi bật nó. –

Các vấn đề liên quan