2010-07-21 12 views
9

BenNHibernate YA Kriterler Sorgu

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

Şimdi

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

alabilirim VE kullanarak aşağıdaki çalışabilmesi için tüm esnaf seçmek bir yolunu olamaz aşağıdaki eşleştirilmiş sınıfları:

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

Bunu nasıl bir VEYA yerine bir VEYA haline dönüştürebilirim. Daha önce Disjunction kullanmıştım, ancak ayrı kriterler, sadece kısıtlamalar nasıl ekleyeceğimi bilmiyorum.

+1

o AccountFrom.Company.ID = X YA AccountTo.Company.ID = X okumak mı ?? Sorunuz – Rippo

+0

Opps olduğu gibi mantıklı değil, evet doğru –

cevap

23

Try:

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

Sana takma Şirketi gerekecektir sanmıyorum.

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

HQL kullanarak:: NHibernate Linq kullanarak

+0

Ahh sayesinde, önce takma ad oluşturmak zorunda! Değil mi' Bunu biliyorum. –

5

NHibernate seçeneklerinin, kullandığınız NHibernate sürümüne bağlı olduğunu düşünüyorum.

disjunction = OR, Bağlaç = VE

Jamie Ide sadece daha fazla iyice cevap here


... bu özü böyle giderse bu soru olarak

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

aynı:

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

Ama nasıl yuvalanmış nesneleri ekleyebilirim? Tek bir mülk üzerinde kısıtlamalara ihtiyacım yok, 2 farklı özellik arasında bir OR'a ihtiyacım var (2 farklı alt sınıfta) –

+0

Detayları vermediğim için üzgünüm ... 'Jamie Ide' sadece bunu yaptı. İstediğin şey olmalı ve ne demeliydim. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

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