簡體   English   中英

NHibernate查詢的復雜標准:Linq還是ICriteria?

[英]Complex criteria for NHibernate query: Linq or ICriteria?

我在基本存儲庫模型中使用帶有FluentNH配置的NH2.1和Linq2NH。 我正在嘗試建立一個查詢,該查詢將從winform中提取各種表單字段。 該標准幾乎是一系列文本框,每個文本框都有一個復選框,說明該標准是否包含通配符(僅支持星號),因此邏輯是一系列的:

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

現在,這對於Linq2Objects來說將是一個很好的選擇,但是由於多種原因(自定義擴展方法,Regex檢查等),它在Linq2NH查詢中不會走得太遠。

我創建了一個不同的搜索頁面,該頁面必須消化相似的數據,但是該查詢是針對不同的存儲庫數據源執行的,該數據源需要將查詢作為字符串(SalesForce SOQL)。 由於NHibernate提供了許多更復雜的,經過編譯器檢查的工具,所以我希望HQL是我的最后選擇。

其他相關信息:

  • 為了使用Linq2Objects過濾結果而檢索和緩存整個表的內容幾乎是不可行的(該表大約有15,000條記錄),但是更可取的是不必這樣做的任何選項。
  • 用戶需要具有盡可能多的通配符; 因此,使用StartsWith()/ EndsWith()/ Contains()解決方法是不可行的。

因此,問題是,您將如何設置它以針對NHibernate執行?

ICriteria ,將HQLICriteriaLinq-to-NH和任何其他API轉換為SQL。 因此,由於MS-SQL Server和其他服務器不直接支持通配符,因此您不能在條件中使用通配符。

我得出的答案是使用StartsWith / EndsWith方法獲取LIKE操作,然后還將所有星號替換為%。 如果條件以星號開頭,請使用EndsWith,否則請使用StartsWith。 這樣會將“ abc *”轉換為“ abc %%”,將“ ** abc”轉換為“ %% abc”,將“ * abc *”轉換為“ %% abc%”,它們的評估結果與非重復的%%通配符相同在LIKE子句中。 唯一無法按指定方式工作的情況是輸入的標准都不以通配符開頭或結尾。 如果將“ a * c”與abc,adc和abcde進行比較,它將得出“ a%c%”而不是“ a%c”,並且將返回所有這些結果而不是排除abcde。 足夠接近我的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM