Принудительная оценка на стороне клиента для выражения построителя предикатов в. net core 3.1 - PullRequest
0 голосов
/ 08 мая 2020

Я использую выражения построителя предикатов LinqKit для функций поиска. Я создаю выражение Dynami c, которое затем применяется к объекту.

Раньше это работало, но после перехода на. net core 3.1 я получаю ошибки из-за ограничений на оценку на стороне клиента .

Я понимаю, что это можно преодолеть путем принудительного преобразования AsEnumerable().

Однако я не совсем понимаю, как это сделать с выражениями предикатов.

Функция построителя предикатов :

private Expression<Func<A, bool>> BuildDynamicWhereClauseForA(string searchValue)
{
    var predicate = PredicateBuilder.New<A>(true);

    if (!string.IsNullOrWhiteSpace(searchValue))
    {
        var searchTerms = searchValue.Split(' ').ToList().ConvertAll(x => x.ToLower());

        foreach (var item in searchTerms)
        {
            predicate = predicate.Or(x => x.col1.ToLower().Contains(item));
            predicate = predicate.Or(x => x.col2.ToLower().Contains(item));
            predicate = predicate.Or(x => x.col3.ToString().ToLower().Contains(item));
        }
    }

    return predicate;
}

Функция, которая выполняет фактический вызов базы данных:

private List<AD> GetDataFromDBForA(string searchBy ...)
{
    var whereClause = BuildDynamicWhereClauseForA(searchBy);

    List<AD> result;

    result =  db.A.AsExpandable()
                  .Where(whereClause)
                  .OrderBy(sortBy)
                  .Select(m => new AD
                                   {
                                      ...
                                      ...
                                   })
                  .Skip(skip)
                  .Take(take)
                  .ToList()

    return result;
}

Это ошибка, которую я получаю:

Выражение LINQ 'DbSet .Where ( e => e.col1.ToLower (). Contains (__ item_0) || e.col2.ToLower (). Contains (__ item_0) || e.Col3.ToString (). ToLower (). Contains (__ item_0)) 'может не переводится. Либо перепишите запрос в форме, которая может быть переведена, либо явно переключитесь на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ().

Я понимаю, почему это происходит.

Но я тоже не понимаю предикатов и, кажется, не могу преобразовать результат в enumerable или list, чтобы принудительно выполнить оценку на стороне клиента.

Что я пробовал:

 result =  db.A.AsEnumerable()
               .AsQueryable()
               .Where(whereClause)
               .OrderBy(sortBy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...