实体框架核心3.1.1无法翻译查询的位置。以可以翻译的形式重写查询,

时间:2020-02-06 00:30:32

标签: sql-server linq entity-framework-core aspnetboilerplate ef-core-3.1

将Entity Framework Core从2升级到3.0.0和3.1.1之后,我的代码在Linq where子句中中断了。

我不会使用.AsEnumerable<ExampleObject()

例如:

List<string> exampleFilter = new List<string>(){"filter1" , "filter2"};

var IQuerable<ExampleObjects> objs = repository.GetAll().Where(wh => exampleFilter.Contains(wh.Name));//HERE1

// here code broke in v3.0.0 when apply where with contains
var count = await objs.CountAsync();  

从3.0.0升级到3.1.1之后,最后一个错误已解决,但现在我的代码中断了几行:

objs = objs.Where(wh => MatchFilters(wh.Name, wh.Description,filters));

// here the code broke in v3.1.1
count = await objs.CountAsync();  

这是我的例外:

其中(a => ClassName.MatchEveryFilter(
名称:a.Name,
代码:a.Code,
过滤器:__filters_0))'
无法翻译。以一种可以翻译的形式重写查询,或者通过插入对以下两者的调用来显式切换到客户端评估 AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()

我的代码:

private bool MatchFilters(string name, strin description , List<strings> filters)
{
    foreach(var filter in filters)
    {
        if(!name.Contains(filter) && !description.Contains(filer))
             return false;
    }

    return true;
}

如何在内部使用函数MatchFilters重写我的代码?

1 个答案:

答案 0 :(得分:0)

您可以链接过滤器

var query = context.TableName.AsQueryable();

foreach(var filter in filters)
{
    query = query.Where(x => !x.Name.Contains(filter) && !x.Description.Contains(filter))
}

var result = query.ToList();