NHibernate高级搜索头痛

时间:2011-09-23 18:55:51

标签: linq nhibernate fluent-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 Profiler,我看到正确构建了T-SQL查询。只需传入一个搜索词,搜索就可以正常工作。但是,如果检测到2个或更多个单词,则检测到的最后一个单词是唯一搜索到的单词。例如,如果搜索词是“training excel”,那么,当我单步执行上面的代码时,两个单词都在循环中正确添加,但最终的T-SQL输出具有“excel”在两个逻辑中WHERE子句中的组(即WHERE course.Subject like ('%' + 'excel' + '%')...... AND course.Subject like ('%' + 'excel' + '%')......)。第一组应该有“训练”,第二组应该有“优秀”。

似乎NHibernate正在使用某种查询缓存来提高效率,因为查询签名是相同的(因为我们循环遍历所有单词)。同样,我已经确认在单步执行代码时正在使用这两个单词。

任何想法??

1 个答案:

答案 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))
);

并在关闭时进行谷歌搜索。