Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF Core:无法翻译LINQ表达式_Entity Framework_Linq - Fatal编程技术网

Entity framework EF Core:无法翻译LINQ表达式

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

我正在尝试在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 .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配合得很好