2010-05-29 48 views
3

我需要使用兩個屬性的組合篩選結果列表。一個普通的SQL語句應該是這樣的:NHibernate標準 - 如何過濾屬性組合

SELECT TOP 10 * 
FROM Person 
WHERE FirstName + ' ' + LastName LIKE '%' + @Term + '%' 

中的ICriteria NHibernate的,我最終使用是:

ICriteria criteria = Session.CreateCriteria(typeof(Person)); 
criteria.Add(Expression.Sql(
    "FirstName + ' ' + LastName LIKE ?", 
    "%" + term + "%", 
    NHibernateUtil.String)); 
criteria.SetMaxResults(10); 

它完美,但我不知道這是否是理想的解決方案因爲我仍然在學習NHibernate的Criteria API。什麼是推薦的選擇?

  • 除了Expression.Sql之外還有什麼東西可以執行相同的操作嗎?我試過Expression.Like,但無法弄清楚如何結合名字和姓氏。
  • 我應該在映射類中將FullName屬性映射到公式「FirstName +」'+ LastName「嗎?
  • 我應該在域對象上創建只讀FullName屬性,然後將其映射到列?

回答

13

您可以執行下列操作之一:


Session.CreateCriteria<Person>() 
     .Add(Restrictions.Like(
      Projections.SqlFunction("concat", 
            NHibernateUtil.String, 
            Projections.Property("FirstName"), 
            Projections.Constant(" "), 
            Projections.Property("LastName")), 
      term, 
      MatchMode.Anywhere)) 
+0

僅查詢 - 如何非常有用,不知道該選項。好像我每天都在NHibernate學習新東西。感謝您的投影代碼示例。 – DavGarcia 2010-05-30 05:58:26

0

在純技術方面我沒有答案,但考慮一下: ,因爲你只能有一個輸入框供用戶輸入詞條,你不知道他是怎麼回事進入「富巴」或「巴富」 ......因此,我建議這樣的:

ICriteria criteria = Session.CreateCriteria(typeof(Person)); 
criteria.Add(Expression.Like("FirstName",term, MatchMode.Anywhere) || Expression.Like("LastName",term, MatchMode.Anywhere)); 
criteria.SetMaxResults(10); 
+0

感謝您的建議。最初我嘗試過,但人們正在輸入「約翰史密斯」,並期待看到約翰史密斯彈出。 – DavGarcia 2010-05-30 05:59:47

+0

我處理這種情況是通過查看是否沒有匹配第一個或最後一個空格的空間,如果存在空格,我然後拆分搜索字符串並對第一個和最後一個搜索進行搜索。 – JoshBerke 2013-01-15 20:10:12