C# 有没有办法从EF中的字符串值数组动态生成多个LIKE?

C# 有没有办法从EF中的字符串值数组动态生成多个LIKE?,c#,asp.net-core,ef-core-2.1,C#,Asp.net Core,Ef Core 2.1,我已经设置了一个搜索文本框,在这里搜索将分别抓取每个单词,并使用Contains搜索字段 有没有办法通过Contains搜索字符串数组 //Keep in mind that the array would be generated dynamically through textbox string[] searchWords = { "hello", "world", "today" }; var articles = _swmDbContext.Articles

我已经设置了一个搜索文本框,在这里搜索将分别抓取每个单词,并使用Contains搜索字段

有没有办法通过Contains搜索字符串数组

//Keep in mind that the array would be generated dynamically through textbox
string[] searchWords = { "hello", "world", "today" };

var articles = _swmDbContext.Articles
                        .Include(c => c.Category)
                        .Where(a => a.Title.Contains(searchWords));
searchWords显然不起作用,但它试图展示我想要实现的目标。searchWords[0]之所以有效,是因为它只是一个单词

我还按照其他链接中的建议尝试了以下内容,但现在在运行调试器或探查器时,WHERE子句未显示在查询中:

`var articles = _swmDbContext.Articles
                 .Include(c => c.Category)
                 .Where(a => searchWords.Any(w => a.Title.Contains(w)));

`

实体框架核心似乎不翻译
。任何
。所有
都包含在上述查询到SQL语句中的
。相反,它加载所有匹配的数据,并在内存中进行搜索

如果您想在标题中查找包含所有搜索词的文章,您可以动态添加
。其中
条件(我有一个包含人员和注释字段的测试数据库):

但您可以动态构建表达式:

Expression<Func<Person, bool>> e1 = p => p.Comment.Contains(searchWords[0]);
Expression<Func<Person, bool>> e2 = p => p.Comment.Contains(searchWords[1]);
Expression<Func<Person, bool>> e3 = p => p.Comment.Contains(searchWords[2]);
var orExpression1 = Expression.OrElse(e1.Body, Expression.Invoke(e2, e1.Parameters[0]));
var orExpression2 = Expression.OrElse(orExpression1, Expression.Invoke(e3, e1.Parameters[0]));
var finalExpression = Expression.Lambda<Func<Person, bool>>(orExpression2, e1.Parameters);  
作为一项功能:

Expression<Func<Person, bool>> BuildOrSearchExpression(string[] searchWords)
{
    // searchWords must not be null or empty

    var expressions = searchWords.Select(s => (Expression<Func<Person, bool>>)(p => p.Comment.Contains(s))).ToList();

    if (expressions.Count == 1) return expressions[0];

    var orExpression = expressions.Skip(2).Aggregate(
        Expression.OrElse(expressions[0].Body, Expression.Invoke(expressions[1], expressions[0].Parameters[0])),
        (x, y) => Expression.OrElse(x, Expression.Invoke(y, expressions[0].Parameters[0])));

    return Expression.Lambda<Func<Person, bool>>(orExpression, expressions[0].Parameters);
}   
如果将
.OrElse
.AndAlso
交换,则必须找到与多个
.where
子句类似的所有搜索词


当我做一些研究时,我还偶然发现了PredicatedBuilder和这个SearchExtension。但我还没有试过,也不知道它们是否与EF Core配合使用。

可能是重复的,我不认为这是重复的。这个问题是针对EF核心的,而不仅仅是LINQ。表达式函数起了作用。这让我更喜欢EF Core。我认为这是他们应该在未来版本中构建的东西。如果可以的话,我会给你买杯啤酒……干杯!如何向该函数中的相关数据添加OR语句,例如,他们还想比较TaxiIdentificationNumber中的属性@nooxThanks,虚拟啤酒;)我没有尝试过,但可能会添加另一个表达式,其中包含
expressione4=p=>p.TaxIdentificationNumber.Number.Contains(searchWord)
Expression<Func<Person, bool>> e1 = p => p.Comment.Contains(searchWords[0]);
Expression<Func<Person, bool>> e2 = p => p.Comment.Contains(searchWords[1]);
Expression<Func<Person, bool>> e3 = p => p.Comment.Contains(searchWords[2]);
var orExpression1 = Expression.OrElse(e1.Body, Expression.Invoke(e2, e1.Parameters[0]));
var orExpression2 = Expression.OrElse(orExpression1, Expression.Invoke(e3, e1.Parameters[0]));
var finalExpression = Expression.Lambda<Func<Person, bool>>(orExpression2, e1.Parameters);  
var persons = dbContext.Persons.Where(finalExpression).ToList();
Expression<Func<Person, bool>> BuildOrSearchExpression(string[] searchWords)
{
    // searchWords must not be null or empty

    var expressions = searchWords.Select(s => (Expression<Func<Person, bool>>)(p => p.Comment.Contains(s))).ToList();

    if (expressions.Count == 1) return expressions[0];

    var orExpression = expressions.Skip(2).Aggregate(
        Expression.OrElse(expressions[0].Body, Expression.Invoke(expressions[1], expressions[0].Parameters[0])),
        (x, y) => Expression.OrElse(x, Expression.Invoke(y, expressions[0].Parameters[0])));

    return Expression.Lambda<Func<Person, bool>>(orExpression, expressions[0].Parameters);
}   
var persons = dbContext.Persons
    .Include(p => p.TaxIdentificationNumber)
    .Where(BuildOrSearchExpression(searchWords))
    .ToList();