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

本文关键字:单词 字符串 搜索 数据库 | 更新日期: 2023-09-27 18:05:25

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

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行中使用单词时,结果必须缩小范围。

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

试试这个:

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

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

我通过这样反转逻辑取得了一些成功:

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;

这里假设查询中的所有单词。Include必须出现在Subject中,如果你想找到任何有query.Include.All至少一个单词的主题,应该是query.Include.Any

我已经测试了这与实体框架4。这将创建一个SQL查询,该查询应用数据库中而不是内存中的所有条件。

给你:

var result = from x in dataBase.tableName 
             select x;
string[] words = enteredString.Split(); 
result.Where(r => words.Any(w => r.Subject.Contains(w));

它无法做到这一点-因为每个单词都覆盖了之前的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>