2009-11-18 27 views

Trả lời

3

tôi làm việc ra làm thế nào để làm điều này bằng cách sử dụng biểu IsNotEmpty. Ở đây nó được sử dụng NHibernate Lambda Extensions:

Session.CreateCriteria<FooBar>() 
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes)) 
    .List<FooBar>(); 
+0

Thật vậy ... và bạn đã cho tôi ý tưởng rằng nó có thể được thực hiện một cách đơn giản hơn và không có phần mở rộng Lambda Nhibernate. Tôi đã chỉnh sửa câu trả lời của mình để bao gồm tùy chọn đó. – tolism7

28

Đây là cách bạn có thể làm điều đó:

var fooBars = Session.CreateCriteria<FooBar>() 
     .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>(); 

... giả sử có một tài sản thu (một-nhiều) "Baz" trong đối tượng FooBar.

Hoặc bạn có thể sử dụng các tiêu chí tách ra như thế:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id")); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 
+0

Rất tốt! Cảm ơn! – ldp615

+0

Điều này đã giúp tôi giải quyết ERIBOR NHIBERNATE: "Không thể tìm thấy nhà cung cấp thông tin tiêu chí phù hợp với", cảm ơn bạn vì ví dụ đơn giản. – Timbob

5

Vừa giải quyết một vấn đề có liên quan và cuối cùng đi đến một giải pháp tôi nghĩ rằng tôi muốn chia sẻ câu trả lời ở đây:

Giả sử bạn muốn những câu hỏi ban đầu truy vấn, với một điều kiện bổ sung về phụ truy vấn:

SELECT * FROM FooBar fb 
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id 
       AND Quantity = 5) 

Giả sử bạn có một tham chiếu trên lớp Baz để phụ huynh, gọi, nói FooBarRef [trong thạo Bản đồ lớp học mà bạn muốn sử dụng các tài liệu tham khảo() phương pháp], bạn sẽ tạo truy vấn như sau:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id")) 
     .Add(Expression.Eq("baz.Quantity", 5)); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 

Tôi không bị thuyết phục về mã hóa bí danh "này", là bí danh NHibernate tự động gán cho thực thể gốc (bảng) trong truy vấn, nhưng đó là cách duy nhất tôi đã được tìm thấy để tham chiếu khóa của bảng truy vấn của cha mẹ từ bên trong truy vấn phụ.

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