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 一起使用。