繁体   English   中英

使用Entity Framework逐字进行动态搜索

[英]Dynamic search using Entity Framework word by word

我是实体框架的新手。 我需要在数据库中存储的文本中搜索“约翰尼”一词。 文本来自pdf文件。 因此,在文本列中有很多单词。

这是我的代码

using (var d = new DatabaseContext())
{
    var l = d.Pages.Where(x => x.Text.ToLower().Contains(text.ToLower())).ToList();
}

到目前为止,代码正在运行。

但是要求改变了。 如果用户键入jhonny bravo ,则程序将必须在“ Text列中搜索单词jhonnybravo 即使在“ Text列中的单词是,也应该找到jhonnybravo

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个单词怎么办? 我该如何查询? 谢谢。

您可以根据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();
}

在这里,我将文本分割为空格,然后获得文本中每个单词的列表。

我还使用方法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 true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM