Entity Framework Core 3.1.1. Где запрос не может быть переведен. Либо переписать запрос в форме, которая может быть переведена, - PullRequest
2 голосов
/ 06 февраля 2020

После того, как я обновил 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: __filters_0)) '
не может быть переведено , Либо переписать запрос в форме, которую можно перевести, либо явным образом переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ()

Мой код:

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 голосов
/ 06 февраля 2020

Вы можете связать свои фильтры

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...