Entity Framework Core 3.1.1无法翻译查询的地方。以一种可以翻译的形式重写查询,

问题描述 投票:1回答: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();  

这是我的例外:

Where(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在哪里重写代码?

sql-server linq entity-framework-core aspnetboilerplate ef-core-3.1
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.