在数据库中搜索字符串中的单词
本文关键字:单词 字符串 搜索 数据库 | 更新日期: 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>
…