Entity Framework 搜索多个词
Entity Framework search multiple words
我想使用 Entity Framework (EF6) 创建搜索查询。为了更好地理解,我将举例说明。
我有 5 个单词(字符串)。
"My name is jack"
"My age is 35 years old"
"My job is developper"
"what is your name"
"China's population is over 1 billion"
现在我想创建一个具有以下结果的 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();
但我无法得到正确答案。
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);
}
此代码将搜索文本按 'Words'(空格)拆分,然后逐字获取带有搜索文本的问题。
@jonaChaz 的答案有效,但在一个重要方面效率低下:它将为搜索中的每个术语生成 1 个 round-trip 到 SQL 的查询。如果您改用这种方式编写,EntityFramework 会将其编译为单个查询/往返服务器,并且可以节省大量开销,尤其是对于 multi-term 搜索:
string search = "My name";
var terms = search.Split(' ');
var results = _db.QuestionTb1
.Where(q => terms.Any(term => q.questionTitle.Contains(term)))
.ToList();
我想使用 Entity Framework (EF6) 创建搜索查询。为了更好地理解,我将举例说明。
我有 5 个单词(字符串)。
"My name is jack"
"My age is 35 years old"
"My job is developper"
"what is your name"
"China's population is over 1 billion"
现在我想创建一个具有以下结果的 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();
但我无法得到正确答案。
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);
}
此代码将搜索文本按 'Words'(空格)拆分,然后逐字获取带有搜索文本的问题。
@jonaChaz 的答案有效,但在一个重要方面效率低下:它将为搜索中的每个术语生成 1 个 round-trip 到 SQL 的查询。如果您改用这种方式编写,EntityFramework 会将其编译为单个查询/往返服务器,并且可以节省大量开销,尤其是对于 multi-term 搜索:
string search = "My name";
var terms = search.Split(' ');
var results = _db.QuestionTb1
.Where(q => terms.Any(term => q.questionTitle.Contains(term)))
.ToList();