实体框架搜索多个单词

问题描述 投票:0回答:3

我想使用实体框架 (EF6) 创建搜索查询。为了更好地理解,我将举例说明。

我有 5 个单词(字符串)。

  1. “我的名字是杰克”

  2. “我的年龄是35岁”

  3. “我的工作是开发人员”

  4. “你叫什么名字”

  5. “中国人口超过10亿”

现在我想创建一个具有以下结果的 EF 查询搜索:

  • 当搜索为
    My name
    时,结果为数字 1 和 2 以及 3 和 4
  • 当搜索为
    is
    时,结果是数字1、2、3、4和5

这是我的询问:

var query = (from q1 in _db.QuestionTbl where q1.questionTitle.Any(a => q1.questionTitle.Contains("search")) select q1).ToList();

但我无法得到正确答案。

c# entity-framework asp.net-core entity-framework-6
3个回答
5
投票

@jonaChaz 的答案有效,但在一个重要方面效率低下:它将为搜索中的每个术语生成 1 个 SQL 往返查询。如果您以这种方式编写,EntityFramework 会将其编译为到服务器的单个查询/往返行程,并且可以节省大量开销,特别是对于多术语搜索:

    string search = "My name";
    var terms = search.Split(' ');
    var results = _db.QuestionTb1
        .Where(q => terms.Any(term => q.questionTitle.Contains(term)))
        .ToList();

2
投票
    string search = "My is";
    var arr = search.Split(' ');

    List<QuestionTb1> query = new List<QuestionTb1>();
    foreach (var word in arr)
    {
        var newQuestionTb1s = _db.QuestionTb1.Where(a => a.questionTitle.Contains(word)).Except(query).ToList();
        query.AddRange(newQuestionTb1s);
    }

此代码按“单词”(空格)分割搜索文本,然后逐字获取搜索文本的问题。


0
投票

我创建了一个 nuget 包来解决这个问题。 使用 Ninjanye.SearchExtensions 你可以执行以下操作

string searchTerm = "My name";
var searchTerms = searchTerm.Split(' ');

_db.QuestionTb1.Search(q1 => q1.questionTitle)
               .Containing(searchTerms)

这将返回与提供的字符串数组中的any匹配的记录


希望这对未来的观众有所帮助。您可以使用该包执行更多操作,您可以在 project README.md

中看到
© www.soinside.com 2019 - 2024. All rights reserved.