首页 > 解决方案 > EF Core:无法翻译 LINQ 表达式

问题描述

我正在尝试在 EF Core 中实现一个查询,在该查询中我需要获取字符串数组中的任何名称都包含在数据对象名称中的数据。这是代码示例:

            var searchKeys = search.Split(' ');
            var objects = _db.Objects
                .Where(o => searchKeys.Any(k => o.name.Contains(k))))  
                .OrderBy(o => o.Name)
                .Select o

但是无法翻译查询,导致以下错误:

无法翻译 LINQ 表达式 'DbSet .Where(o => __searchKeys_1 .Any(k => __Functions_2 .Contains(_: o.Name, propertyReference: k)))'。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038

如何构建查询以修复错误?

标签: entity-frameworklinq

解决方案


出于某种原因,我无法在 .Net Core 3.1 中得到 Obie 的答案来为我工作。幸运的是,LinqKit NuGet 包已针对 .Net Core 进行了升级。所以我定义了这个扩展方法:

// Where any search predicates are true.
public static IQueryable<T> WhereAny<T>(this IQueryable<T> q, params Expression<Func<T, bool>>[] predicates)
{
    var orPredicate = PredicateBuilder.New<T>();
    foreach (var predicate in predicates)
    {
        orPredicate = orPredicate.Or(predicate);
    }
    return q.AsExpandable().Where(orPredicate);
}

然后你会像这样使用它:

var searchKeys = search.Split(' ');
var predicates = searchKeys.Select(k => (Expression<Func<MyObject, bool>>)(x => x.Name.Contains(k)));
var objects = _db.Objects
    .WhereAny(predicates.ToArray())
    .OrderBy(o => o.Name);

推荐阅读