2010-12-07 88 views
0

我在基本倉庫模型中使用NH2.1和FluentNH配置和Linq2NH。我試圖設置一個查詢來消化來自winform的各種表單域。該標準是一個很值得一系列文本框,每一個複選框,說明該標準是否包含通配符(只有星號支持),所以邏輯是一系列的:NHibernate查詢的複雜標準:Linq或ICriteria?

... 
&& Field1.IsNullOrBlank() || Field1 == Criteria1 || (Criteria1IsWildCard && Regex.Match(Field1, Criteria1.Replace("*",".*"))) 
&& Field2.IsNullOrBlank() || Field2 == Criteria2 || (Criteria2IsWildCard && Regex.Match(Field2, Criteria2.Replace("*",".*"))) 

現在,這將會是偉大的Linq2Objects,但是由於多種原因(自定義擴展方法,正則表達式檢查等),Linq2NH查詢不會有太大的改進。

我創建了一個不同的搜索頁面,必須消化類似的數據,但是該查詢是針對不同的Repository數據源執行的,該數據源需要查詢作爲字符串(SalesForce SOQL)。由於NHibernate有很多更復雜的編譯器檢查工具可用,我寧願HQL是我的最後選擇。

其他相關信息:

  • 檢索,並以過濾使用Linq2Objects結果緩存整個表的內容幾乎是行不通的(該表是約15000條記錄),但是任何選項,不必這樣做是非常受歡迎的。
  • 用戶需要有儘可能多的通配符;因此,使用StartsWith()/ EndsWith()/ Contains()解決方法將不可行。

所以,問題是,你將如何設置這個對NHibernate執行?

回答

0

我到達的答案是使用StartsWith /的endsWith方法來獲取LIKE操作,然後還與%更換任何星號。如果標準以星號開始,請使用EndsWith,否則使用StartsWith。這會變成「ABC *」到「ABC %%」,「* ABC」變成「%% ABC」和「* ABC *」變成「%% ABC%」,所有相同的評估爲不重複%%通配符同行在一個LIKE子句中。如果輸入既不以通配符開始也不以結束符結束的條件,那麼它將不能按指定工作的唯一場景是;如果比較「a * c」與abc,adc和abcde,它會評估爲「a%c%」而不是「a%c」,並且將返回所有這些而不是排除abcde。足夠接近我的目的。

0

HQL,ICriteria,Linq-to-NH和其他任何API最終都會轉換爲SQL。因此,作爲MS-SQL Server和其他人不直接支持通配符,你不能在你的標準中使用通配符。

+1

不作爲星號,但MSS支持使用%通配符進行LIKE比較,並且NH ICriteria模型直接支持此操作,而Linq2NH支持將StartsWith,EndsWith和Contains轉換爲開頭,結尾或雙方的% 。 – KeithS 2010-12-08 15:30:08