我真的相信這是一個簡單的問題,但那些有解決方案,這不是明顯的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使用某種查詢緩存的效率,因爲查詢簽名是相同的(因爲我們循環所有的單詞)。再一次,我已經驗證了在單步執行代碼時正在使用這兩個單詞。
任何想法??
哇。在我的.NET編程十年中,我不記得這個陷入困境。然後,我可能會「方便」地忘記!謝謝! – hiro77
我知道!我有Resharper一直在看我的肩膀。看來微軟甚至在考慮下一個c#版本中的'foreach'聲明中的一個突破性改變。 –