在数据库中搜索字符串中的单词

时间:2011-08-14 07:35:59

标签: c# linq

想象一下,用户输入了一个句子,我需要搜索由输入句子中的单词组成的主题。这些代码我认为他们可以解决这个问题。

var result = from x in dataBase.tableName 
             select x;

string[] words = enteredString.Split(); 

foreach(string word in words) 
            {
                result = result.Where(x => x.subject.Contains(word));
            }

它只显示句子中最后一个单词的搜索结果,但我认为每次在where行中使用单词时,结果必须缩小。

4 个答案:

答案 0 :(得分:5)

试试这个:

foreach(string word in words) 
{
  var temp = word;
  result = result.Where(x => x.subject.Contains(temp));
}

这被称为(至少由ReSharper)“访问修改后的闭包” - lambda表达式不捕获,它们捕获整个变量。并且变量word的值随循环的每次迭代而变化。因此,由于Where()方法是惰性求值的,因此在使用此序列时,word的值是序列中的最后一个。

答案 1 :(得分:2)

我通过颠倒这样的逻辑取得了一些成功:

string[] words = enteredString.Split();

var results = from x in database.TableName
              where words.Any(w => x.subject.Contains(w))
              select x;

- 编辑 对于这种查询,更通用的方法是:

class SearchQuery
{
    public ICollection<string> Include { get; private set; }
    public ICollection<string> Exclude { get; private set; }
}

[...]
SearchQuery query = new SearchQuery
{
    Include = { "Foo" }, Exclude = { "Bar" }
}

var results = from x in database.Table
              where query.Include.All(i => x.Subject.Contains(i)) &&
                    query.Exclude.All(i => !x.Subject.Contains(i))
              select x;

这假设query.Include中的所有字词都必须出现在Subject中,如果您要查找至少有一个字query.Include.All应该是query.Include.Any

我已经使用Entity Framework 4进行了测试。这将创建一个SQL查询,它应用数据库中的所有条件而不是内存。

答案 2 :(得分:1)

你走了:

var result = from x in dataBase.tableName 
             select x;

string[] words = enteredString.Split(); 
result.Where(r => words.Any(w => r.Subject.Contains(w));

答案 3 :(得分:0)

它不能做到这一点 - 因为你用覆盖前一个result的每一个字 - 你需要做类似的事情:

List<object> AllResults = new List<object>();

foreach(string word in words) 
{
  var temp = word;
  AllResults.AddRange (result.Where(x => x.subject.Contains(temp)).ToList());
}

不确定结果类型的类型是List<object> ...