EF Core:无法翻译LINQ表达式

时间:2020-02-17 21:13:05

标签: entity-framework 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 哪里(o => __searchKeys_1 .Any(k => __Functions_2 包含( _:o.Name, propertyReference:k)))'无法翻译。以可以翻译的形式重写查询,或切换 通过插入以下任一调用来显式地进行客户评估 AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()。看到 https://go.microsoft.com/fwlink/?linkid=2101038以获得更多信息。

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

2 个答案:

答案 0 :(得分:1)

这对我有用:

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

答案 1 :(得分:1)

由于某种原因,在.Net Core 3.1中我无法获得Obie的答案为我工作。幸运的是,LinqKit NuGet package已针对.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);