2010-07-21 7 views
9

Tôi có các lớp ánh xạ sauNHibernate hoặc Tiêu chuẩn Query

Trade { ID, AccountFrom, AccountTo } 
Account {ID, Company} 
Company {ID} 

Bây giờ tôi không thể tìm ra một cách chọn tất cả các ngành nghề, nơi

AccountFrom.Company.ID = X OR AccountTo.Company.ID = X 

tôi có thể nhận AND để làm việc bằng cách sử dụng sau đây:

criteria.CreateCriteria("AccountFrom").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 
criteria.CreateCriteria("AccountTo").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 

Nhưng làm cách nào tôi có thể chuyển đổi thành OR hoặc thay vì AND. Tôi đã sử dụng Disjunction trước đây, nhưng tôi dường như không biết cách thêm tiêu chí riêng biệt, chỉ là hạn chế.

+1

nó nên đọc AccountFrom.Company.ID = X HOẶC AccountTo.Company.ID = X ?? như câu hỏi của bạn không có ý nghĩa vì nó là – Rippo

+0

Opps, có chính xác của bạn –

Trả lời

23

Thử:

return session.CreateCriteria<Trade>() 
    .CreateAlias("AccountFrom", "af") 
    .CreateAlias("AccountTo", "at") 
    .Add(Restrictions.Or(
     Restrictions.Eq("af.Company.CompanyId", companyId), 
     Restrictions.Eq("at.Company.CompanyId", companyId))) 
    .List<Trade>(); 

Tôi không nghĩ bạn sẽ cần phải bí danh Công ty.

+0

Ahh cảm ơn, bạn phải tạo bí danh đầu tiên! Didn' Tôi biết điều đó. –

5

Tôi nghĩ rằng các tùy chọn NHibernate của bạn phụ thuộc vào phiên bản NHibernate mà bạn đang sử dụng.

phân ly = OR, Liên từ = VÀ

.Add(
    Expression.Disjunction() 
    .Add(companyId1) 
    .Add(companyId2) 
) 

Tương tự như câu hỏi này here


Jamie Ide chỉ trả lời kỹ hơn ... các ý chính của nó đi như thế này:

.Add(Restrictions.Or(
    Restrictions.Eq("object1.property1", criteriaValue), 
    Restrictions.Eq("object2.property3", criteriaValue)) 
+0

Nhưng làm thế nào để thêm các đối tượng lồng nhau? Tôi không cần giới hạn trên một tài sản duy nhất, tôi cần một OR giữa 2 thuộc tính khác nhau (trên 2 lớp phụ khác nhau) –

+0

Tôi xin lỗi vì tôi không đưa ra chi tiết ... 'Jamie Ide' vừa làm. Đó sẽ là những gì bạn muốn, và những gì tôi nên nói. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

Sử dụng LINQ to NHibernate:

var X = 0; // or whatever the identifier type. 
var result = Session.Linq<Trade>() 
       .Where(trade => trade.AccountFrom.Company.ID == X || 
           trade.AccountTo.Company.ID == X) 
       .ToList(); 

Sử dụng HQL:

var X = 0; // or whatever the identifier type. 
var hql = "from Trade trade where trade.AccountFrom.Company.ID = :companyId or trade.AccountTo.Company.ID = :companyID"; 
var result = Session.CreateQuery(hql) 
       .SetParameter("companyId", X) 
       .List<Trade>();