我真的相信这是一个简单的问题,但其中一个解决方案对于像我这样的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 Profiler,我看到正确构建了T-SQL查询。只需传入一个搜索词,搜索就可以正常工作。但是,如果检测到2个或更多个单词,则检测到的最后一个单词是唯一搜索到的单词。例如,如果搜索词是“training excel”,那么,当我单步执行上面的代码时,两个单词都在循环中正确添加,但最终的T-SQL输出具有“excel”在两个逻辑中WHERE子句中的组(即WHERE course.Subject like ('%' + 'excel' + '%')...... AND course.Subject like ('%' + 'excel' + '%')......
)。第一组应该有“训练”,第二组应该有“优秀”。
似乎NHibernate正在使用某种查询缓存来提高效率,因为查询签名是相同的(因为我们循环遍历所有单词)。同样,我已经确认在单步执行代码时正在使用这两个单词。
任何想法??
答案 0 :(得分:0)
这必然是常见的陷阱&#34;访问修改后的闭包&#34;。尝试
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))
);
并在关闭时进行谷歌搜索。