我正在尝试在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以获得更多信息。
如何构造查询以修复错误?
答案 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);