我是实体框架的新手。我需要在存储在数据库中的文本中搜索“johnny”这个词。文本来自pdf文件。因此,在文本列中有很多单词。
以下是我的代码
using (var d = new DatabaseContext())
{
var l = d.Pages.Where(x => x.Text.ToLower().Contains(text.ToLower())).ToList();
}到目前为止,代码运行正常。
但需求发生了变化。如果用户键入jhonny bravo,程序将不得不在Text列中搜索单词jhonny和bravo。应该可以找到jhonny和bravo,即使Text列中的单词是:
Jhonny is bravo
jhonny is not bravo我该如何解决这个问题呢?
我想出了拆分文本并搜索每个单词的想法
using (var d = new DatabaseContext())
{
var split = Regex.Split(text, @"\s+");
if (split.Count() > 1)
{
var l = d.Pages.Where(x => x.Text.ToLower().Contains(text.ToLower())).ToList();
}
}但是使用上面的代码。如何创建动态搜索?如果搜索词包含6个单词怎么办?我该如何进行查询?谢谢。
发布于 2019-02-18 13:32:19
您可以从word条件创建Where链:
using (var db = new DatabaseContext())
{
var words = Regex.Split(text, @"\s+");
var query = db.Pages.AsQuerable();
foreach(var word in words)
query = query.Where(x => x.Text.ToLower().Contains(word.ToLower()));
var answer = query.ToList();
}发布于 2019-02-18 12:53:35
在这里,我将文本拆分成空格,然后我们得到文本中每个单词的列表。
我还使用Distinct()方法删除所有重复的单词,我不确定是否有任何性能提升,但如果你不喜欢它,你可以删除它。
var keywords = ["john", "bravo", "hello"]
var l = d.Pages
.Where(page => {
var words = page.Text.ToLower().Split(' '). Distinct();
foreach(var keyword in keywords) {
if (!words.Contains(keyword.ToLower())
return false;
}
return true;
}
)
.ToList();
// "john," "johnnxx" will also count as truehttps://stackoverflow.com/questions/54740334
复制相似问题