преобразование проверки на стороне клиента в сторону сервера из. net core 2.0 в 3.1 - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь преобразовать приведенный ниже запрос LINQ со стороны клиента на сторону сервера. Поскольку. net core 3.1 больше не поддерживает проверки на стороне клиента

    var response = await _db.MyTable
    .Where(ba =>
    ba.status == null
    && (today - (ba.Reminder ?? ba.CreatedOn)).TotalDays > 6
    && (today < ba.CreatedOn.AddDays(50) && ba.AccountNumber == null ||
    futureAccounts.Contains(ba.AccountNumber)))
    .Include(ba => ba.AccountInfo)
    .Where(ba => ba.AccountInfo.Any(x => x.Type.Equals("EC")))
    .Include(b => b.Branch)
.Include(ba => ba.Services).ThenInclude(s => s.Name)
.OrderBy(ba => ba.CreatedOn)
.Skip(skip)
.Take(500)
.ToListAsync();

Я испробовал все свои варианты, которые все еще говорят:

Либо переписать запрос в форме, которая может перевести или явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

1 Ответ

0 голосов
/ 13 марта 2020

В EF3 произошли серьезные изменения. Начиная с версии 3.0, EF Core позволяет оценивать только выражения в проекции верхнего уровня (последний вызов Select () в запросе) на клиенте. Если выражения в любой другой части запроса не могут быть преобразованы в SQL или в параметр, возникает исключение.

Чтобы оценить условие предиката на клиенте, попробуйте использовать приведенный ниже код с AsEnumerable()

var response  =    _db.MyTable
                        .Include(ba => ba.AccountInfo)
                        .Include(b => b.Branch)
                        .Include(ba => ba.Services).ThenInclude(s => s.Name)
                        .AsEnumerable()// switches to LINQ to Objects
                        .Where(ba =>
                            ba.status == null
                            && (today - (ba.Reminder ?? ba.CreatedOn)).TotalDays > 6
                            && (today < ba.CreatedOn.AddDays(50) && ba.AccountNumber == null ||
                            futureAccounts.Contains(ba.AccountNumber)))

                        .Where(ba => ba.AccountInfo.Any(x => x.Type.Equals("EC")))

                        .OrderBy(ba => ba.CreatedOn)
                        .Skip(skip)
                        .Take(500)
                        .ToList();

См. https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/#restricted -клиент-оценка

...