2016-05-13 56 views
1

好的,長時間的偵聽器,第一次調用者。queryover - 具有屬性和相同性能的引用屬性的QueryOver

我正在嘗試使用QueryOver API編寫查詢,該查詢將搜索實體的某些屬性的多個術語。問題是這些屬性中的一些是對另一個實體的引用;但是,我仍然需要在該參考文獻的屬性中搜索給定的術語。

我希望能夠寫下類似的代碼。在下面的代碼中,FirstName,MiddleName和LastName都是Person實體上的基本字符串屬性。部門屬性是部門類型的參考資產。部門實體有三個屬性:Id,Value,Description。它是Person.Department.Value,必須同時搜索給定的術語和基本屬性。

var queryOver = session.QueryOver<Person>(); 
foreach (string term in searchTerms) 
{ 
    queryOver = queryOver.Where(Restrictions.On<Person>(x => x.FirstName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        Restrictions.On<Person>(x => x.LastName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        Restrictions.On<Person>(x => x.MiddleName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        //This following line doesn't work. 
        Restrictions.On<Person>(x => x.Department.Value).IsInsensitiveLike(term, MatchMode.Anywhere) 
} 

我試過使用別名和使用NHibernate.Linq /查詢API。我知道我需要使用別名進行某種連接,但我想我不瞭解我讀過的所有問題/文章。他們中的大多數人似乎都在討論對引用或子進行查詢/子查詢,但我遇到的問題是將這些查詢翻譯爲查詢,並將其與其他屬性相互轉換,並將它們全部或排列在一起。

最終的SQL我拍攝的是這樣的:

SELECT * 
FROM `persons` 
WHERE (`FirstName` LIKE '%term1%' OR 
     `LastName` LIKE '%term1%' OR 
     `MiddleName` LIKE '%term1%' OR 
     `Department`.`Value` LIKE '%term1%') AND //I know this won't work 
     (`FirstName` LIKE '%term2%' OR 
     `LastName` LIKE '%term2%' OR 
     `MiddleName` LIKE '%term2%' OR 
     `Department`.`Value` LIKE '%term2%') AND etc... 

最後,非常感謝你提前爲任何幫助。我願意在NHibernate中使用不同的API,如果你認爲我可以用不同的查詢獲得相同的結果,甚至可以使用不同的搜索策略。

回答

0

好吧,我終於明白了。由於這些職位指着我在正確的方向:

QueryOver Or with Subquery

Filtering and projecting an association using NHibernate QueryOver

下面是我想出了做什麼,我需要的代碼。我真的不想用隨機變量設置爲空的醜陋別名,我也不希望有一堆不同的查詢在別處定義。如果有人需要,我可以進一步解釋。

var persons = session.QueryOver<Person>() 
       .Where(Restrictions.Disjunction() 
        .Add(Subqueries.WhereProperty<Person>(x => x.Department.Id).In(QueryOver.Of<Department>().WhereRestrictionOn(x => x.Value).IsInsensitiveLike("somedep", MatchMode.Anywhere).Select(x => x.Id))) 
        .Add<Person>(x => x.LastName.IsInsensitiveLike("somedep", MatchMode.Anywhere))) 
       .Where(Restrictions.Disjunction() 
        .Add(Subqueries.WhereProperty<Person>(x => x.Department.Id).In(QueryOver.Of<Department>().WhereRestrictionOn(x => x.Value).IsInsensitiveLike("myname", MatchMode.Anywhere).Select(x => x.Id))) 
        .Add<Person>(x => x.LastName.IsInsensitiveLike("myname", MatchMode.Anywhere)))) 
       .List();