2009-07-01 82 views
2

我需要使用nHibernate Criteria重新創建查詢。這個查詢有一個非常醜陋的where子句。nHibernate標準查詢OR或IN?

((t.Disposition_CD)='ac' Or  
(t.Disposition_CD)='cc' Or 
(t.Disposition_CD)='Co' Or 
(t.Disposition_CD)='SF' Or 
(t.Disposition_CD)='SC' Or 
(t.Disposition_CD)='OR' Or 
(t.Disposition_CD)='SV' Or 
(t.Disposition_CD)='RI' Or 
(t.Disposition_CD)='WN' Or 
(t.Disposition_CD)='NC' Or 
(t.Disposition_CD)='DN' Or 
(t.Disposition_CD)='WT' Or 
(t.Disposition_CD)='MA' Or 
(t.Disposition_CD)='TO' Or 
(t.Disposition_CD)='OC')) 

所以,我開始在這裏

IList leadList = 
    session.CreateCriteria(typeof(Lead)).Add(Expression.In("CallDisposition", 
    new string[] {"AC","CC" })).List(); 

問題的物業上鉛是一種CallDisposition對象,並給了我一個Unknown entity class: System.String錯誤,當我嘗試這樣做。一個CallDisposition數組是它正在尋找。

基本上我正在尋找的是一個潛在客戶的列表,符合原始查詢的所有或標準。任何建議都有幫助。

+0

使用代碼格式化按鈕比1000s的空間容易得多... – Greg 2009-07-01 08:54:22

+0

感謝Greg,您的建議非常有建設性並且有幫助 – jim 2009-07-01 08:59:07

回答

2

不知道實體的屬性很難評論。

如果CallDisposition屬性是有CallDispostionCode屬性,那麼你可以做這樣的事情一個CallDisposition實體:

IList leadList = session.CreateCriteria(typeof(Lead)) 
    .Add(Expression.In("CallDisposition.CallDispostionCode", 
         new string[] {"AC","CC" })).List(); 

或者,如果CallDisposition有一個ID,你可以修改你的第二個解決方案是這樣的:

DetachedCriteria criteria = DetachedCriteria.For<CallDisposition>() 
    .Add(Expression.In("CallDispostionCode", new string[] { "AC", "CC" }) 
    .SetProjection(Projections.Property("CallDisposition.Id")); 

IList leadList = session.CreateCriteria(typeof(EmcLead)) 
    .Add(Subqueries.PropertyIn("CallDisposition.Id", criteria)).List(); 

這將只是一個使用子查詢命中的數據庫。

1

好的......我達到了預期的效果,但我用不同的方式去了解它。

第一我這樣做

IList DispList = session.CreateCriteria(typeof(CallDisposition)).Add(Expression.In("CallDispostionCode", new string[] { "AC", "CC" })).List(); 

其次是這個

IList leadList = session.CreateCriteria(typeof(EmcLead)).Add(Expression.In("CallDisposition", DispList)).List(); 

如果我存儲在CallDispositionCodeLead對象我將能夠有權牽頭,並得到CallDispositionCode。這是一個設計問題。

如果有人有任何建議或意見,我會有興趣聽到。