entity-framework - 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。
如何构建查询以修复错误?
解决方案
出于某种原因,我无法在 .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);
推荐阅读
- arrays - Bash 中的列表是什么?
- javascript - 社区标准和利弊?破坏性与非破坏性迭代
- java - Android Studio Activity_main.xml
- unit-testing - 无法使用带有 Prism 的 MSTest 设置 Xamarin Forms 单元测试
- sql - 百分比值的计算
- java - Firebase 序列化问题 [更新]
- javascript - 使用 Vue.js 创建可重用的按钮组件
- sql - 删除 select 语句中存在 column 的行
- algorithm - GLSL在一次操作中读取比较和写入?
- python - file.read() 是否保证读取整个文件?