Entity framework EF Core:无法翻译LINQ表达式
我正在尝试在EF Core中实现一个查询,其中需要获取数据,其中字符串数组中的任何名称都包含在数据对象的名称中。以下是代码示例:Entity framework EF Core:无法翻译LINQ表达式,entity-framework,linq,Entity Framework,Linq,我正在尝试在EF Core中实现一个查询,其中需要获取数据,其中字符串数组中的任何名称都包含在数据对象的名称中。以下是代码示例: var searchKeys = search.Split(' '); var objects = _db.Objects .Where(o => searchKeys.Any(k => o.name.Contains(k)))) .Orde
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
.Whereo=>\uu搜索键\u 1
.Anyk=>\uuu函数\u2
.包含
_:o.姓名,
无法翻译propertyReference:k'。以可翻译的形式重写查询,或切换
通过插入对
A可计算、A同步可枚举、ToList或ToListSync。看见
了解更多信息
如何构造查询以修复错误 这对我很有用:
var searchKeys = search.Split(' ');
var objects = _db.Objects
.Where(o => searchKeys.Any(k => o.Name.Contains(k)))
.OrderBy(o => o.Name)
.Select(o => o);
这对我很有用:
var searchKeys = search.Split(' ');
var objects = _db.Objects
.Where(o => searchKeys.Any(k => o.Name.Contains(k)))
.OrderBy(o => o.Name)
.Select(o => o);
出于某种原因,我无法让欧比的答案在.NETCore3.1中为我工作。幸运的是,已为.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);
出于某种原因,我无法让欧比的答案在.NETCore3.1中为我工作。幸运的是,已为.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);
你查过链接了吗?由于错误表明ef core 3.0中不允许此评估,请阅读此处:您实际上希望将like与in结合起来。这没那么容易。谢谢你的回复。由于objects表将包含大量数据,我希望可以查询其中一个属性,并将其与搜索键进行部分比较。很像普通的搜索引擎。我想你想用o.Name.Containsk替换o.Containsk。刚刚修复了它,是错误的。你检查了链接了吗?由于错误表明ef core 3.0中不允许此评估,请阅读此处:您实际上希望将like与in结合起来。这没那么容易。谢谢你的回复。由于objects表将包含大量数据,我希望可以查询其中一个属性,并将其与搜索键进行部分比较。很像普通的搜索引擎。我想你想用o.Name.Containsk替换o.Containsk。刚刚修复了它,被误认为是奇怪的,如果你把.ToList放在选择的末尾,它还能工作吗?刚刚尝试了这个,仍然会出错-你运行的是哪一个版本的3.1奇怪,如果你把.ToList放在选择的末尾,它仍然有效吗?刚刚尝试了这个,我仍然得到了错误-你运行的3.1的哪个版本与EF Core 5.x配合得很好与EF Core 5.x配合得很好