Я использую выражения построителя предикатов 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)