2010-07-21 107 views
9

我有以下映射類NHibernate的或標準查詢

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

現在我不能想出一個辦法選擇各行業,其中

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

我可以獲取和使用工作如下:

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

但是我怎樣才能把它轉換成一個OR而不是一個AND。我以前使用過分詞,但我似乎無法知道如何添加單獨的條件,只是限制。

+1

它應該閱讀AccountFrom.Company.ID = x或AccountTo.Company.ID = X?因爲你的問題沒有意義,因爲它是 – Rippo 2010-07-21 12:47:44

+0

Opps,是的你的正確 – 2010-07-21 12:52:36

回答

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

我不認爲你需要別名公司。

+0

啊謝謝,你必須首先創建別名!沒」不知道,謝謝 – 2010-07-21 13:24:49

5

我覺得你的NHibernate選項取決於你正在使用的NHibernate版本。

析取= OR,連詞= AND

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

與此相同的問題here


傑米井只是回答更徹底......它的主要內容是這樣的:

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

但是,我如何添加嵌套的對象?我不需要對單個屬性進行限制,我需要2個不同屬性之間的OR(在2個不同的子類上) – 2010-07-21 12:28:22

+0

對不起,我沒有提供詳細信息......'Jamie Ide'只是做了。這應該是你想要的,而我應該說的。 。新增(Restrictions.Or( Restrictions.Eq( 「object1.property1」,criteriaValue), Restrictions.Eq( 「object2.property3」,criteriaValue)) – 2010-07-21 12:58:21

3

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

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