2011-09-23 59 views
0

我真的相信這是一個簡單的問題,但那些有解決方案,這不是明顯的NHibernate的新手,像我這樣的一個...NHibernate的高級搜索頭痛

事情是這樣的,我在我進行NHibernate-從一個對NHibernate一無所知的數據服務層(用於分離關注點)的相關查詢。因此,我通過使用LINQ(Sytem.Linq)構造我的查詢。

我想搜索多個字。例如,如果某人輸入「training excel」,那麼我將根據這兩個詞搜索多個實體和相關位置實體。

這裏是我的代碼看起來像我的服務層現在:

// We are delimiting by spaces and commas. 
string delimiterString = " ,"; 
char[] delimiter = delimiterString.ToCharArray(); 
IEnumerable<string> words = searchWords.Split(delimiter, StringSplitOptions.RemoveEmptyEntries); 
// Loop through each search word in the collection and apply the "Where" clause to our IQueryable collection: 
foreach (string word in words) { 
    matches = matches.Where(i => i.Subject.Contains(word) 
     || i.Background.Contains(word) 
     || i.Summary.Contains(word) 
     || i.Organization.Contains(word) 
     || i.Locations.Any(l => l.Organization.Contains(word)) 
     || i.Locations.Any(l => l.City.Contains(word)) 
    ); 
} 

這裏的問題......通過觀看我的應用程序日誌和運行NHibernate的探查,我看到的是,T-SQL查詢是正確的正在構建。搜索工作正常,僅傳入一個搜索詞。但是,如果檢測到2個或更多個單詞,則檢測到的最後一個單詞是唯一搜索的單詞。例如,如果搜索項是「training excel」,那麼,當我逐句通過我的代碼時,兩個單詞都被正確添加到循環中,但最終的T-SQL輸出在兩個邏輯組中都有「excel」在WHERE子句中(即WHERE course.Subject like ('%' + 'excel' + '%')...... AND course.Subject like ('%' + 'excel' + '%')......)。第一組應該有「訓練」,第二組應該有「優秀」。

看起來好像NHibernate使用某種查詢緩存的效率,因爲查詢簽名是相同的(因爲我們循環所有的單詞)。再一次,我已經驗證了在單步執行代碼時正在使用這兩個單詞。

任何想法??

回答

0

這一定是常見的陷阱「訪問修改後的封閉」。嘗試

foreach (string word in words) 
{ 
    var wordLoopVariable = word; 
    matches = matches.Where(i => i.Subject.Contains(wordLoopVariable) 
    || i.Background.Contains(wordLoopVariable) 
    || i.Summary.Contains(wordLoopVariable) 
    || i.Organization.Contains(wordLoopVariable) 
    || i.Locations.Any(l => l.Organization.Contains(wordLoopVariable)) 
    || i.Locations.Any(l => l.City.Contains(wordLoopVariable)) 
); 

並做一些關閉封閉搜索。

+0

哇。在我的.NET編程十年中,我不記得這個陷入困境。然後,我可能會「方便」地忘記!謝謝! – hiro77

+0

我知道!我有Resharper一直在看我的肩膀。看來微軟甚至在考慮下一個c#版本中的'foreach'聲明中的一個突破性改變。 –