2011-09-17 23 views
3

我有JoinQueryOver NHibernate的3.1QueryOver通過加入和加入條件的獨立,如果

Person類具有通過身份類(一個對一個) 代碼是Person類的字段和相關聯的QueryOver FirstName是Identity類的字段。

var q = SessionInstance.QueryOver<Person>() 
     .Where(p => p.Code.IsLike(code,MatchMode.Start)) 
     .Full.JoinQueryOver(p => p.Identity); 

if (!String.IsNullOrEmpty(firstName)) 
    q = q.Where(i => i.FirstName.IsLike(firstName, MatchMode.Anywhere)); 

return q.List<Person>(); 

結果是正確的,但是,有一個問題。搜索不包括Person類中的Code域的空值。我更正爲以下查詢。

var q = SessionInstance.QueryOver<Person>() 
     .Full.JoinQueryOver(p => p.Identity); 

if (!String.IsNullOrEmpty(Code)) 
    q = q.Where(i => i.Person.Code.IsLike(code, MatchMode.Start)); 

if (!String.IsNullOrEmpty(firstName)) 
    q = q.Where(i => i.FirstName.IsLike(firstName, MatchMode.Anywhere)); 

return q.List<Person>(); 

現在我有一個運行時錯誤此消息:

無法解析屬性:的Identity.Code:MyNameSpace.Domain.Entities.Identity

在查詢中通過兩個類之間的連接,如何通過if添加兩個條件(where)。

(if parameter != null)

回答

3
Identity identityAlias = null; 
var q = SessionInstance.QueryOver<Person>() 
     .Full.JoinAlias(p => p.Identity,() => identityAlias); 

if (!String.IsNullOrEmpty(code)) 
    q.Where(p => p.Code.IsLike(code, MatchMode.Start)); 

if (!String.IsNullOrEmpty(firstName)) 
    q.Where(() => identityAlias.FirstName.IsLike(firstName, MatchMode.Anywhere)); 

var q = SessionInstance.QueryOver<Person>(); 

if (!String.IsNullOrEmpty(code)) 
    q.Where(p => p.Code.IsLike(code, MatchMode.Start)); 

if (!String.IsNullOrEmpty(firstName)) 
    q.Full.JoinQueryOver(p => p.Identity) 
     .Where(i => i.FirstName.IsLike(firstName, MatchMode.Anywhere)); 
+0

感謝。我的問題解決了。 – Ehsan

+0

當然,第一個解決方案解決了我的問題。第二種解決方案的最後一個構建錯誤是,如果通過此消息:不能隱式地將類型'NHibernate.IQueryOver '轉換爲'NHibernate.IQueryOver 」。存在明確的轉換(您是否缺少演員?) – Ehsan