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

2024-02-18

我设置了一个搜索文本框,其中搜索将单独抓取每个单词并使用“包含”搜索字段。

有没有办法通过 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)));

`


Entity Framework Core 似乎没有翻译.Any and .All with .Contains上述查询中的SQL语句。相反,它会加载所有其他匹配的数据并在内存中进行搜索。

如果您想查找包含以下内容的文章all您可以动态添加标题中的搜索词.Where条件(我有一个包含人员和评论字段的测试数据库):

var query = (IQueryable<Person>)dbContext.Persons
    .Include(p => p.TaxIdentificationNumber);

foreach (var searchWord in searchWords)
{
    query = query.Where(p => p.Comment.Contains(searchWord));
}

var persons = query.ToList();

但如果你想找到包含以下内容的文章any的搜索词,那么你需要一个OR in the .Where clause.

手动编写它看起来像这样:

.Where(p => p.Comment.Contains(searchWords[0]) || p.Comment.Contains(searchWords[1]))

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

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();  

如果您交换.OrElse with .AndAlso必须找到所有搜索词,就像多个搜索词一样.where条款。

当我做了一些研究时,我也偶然发现了 PredicatedBuilderhttp://www.albahari.com/nutshell/predicatebuilder.aspx http://www.albahari.com/nutshell/predicatebuilder.aspx和这个搜索扩展https://stackoverflow.com/a/31682364/5550687 https://stackoverflow.com/a/31682364/5550687。但我没有尝试过它们,我不知道它们是否可以与 EF Core 一起使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法从 EF 中的字符串值数组动态生成多个点赞? 的相关文章

随机推荐