преобразование проверки на стороне клиента на сторону сервера с .NET core 2.0 на 3.1

Я пытаюсь преобразовать запрос 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 () или ToListAsync (). См. https://go.microsoft.com/fwlink/?linkid=2101038. для дополнительной информации.


person Roshan    schedule 13.03.2020    source источник


Ответы (1)


В 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-client-evaluation

person Ryan    schedule 13.03.2020
comment
Я видел, что в структуре сущностей есть некоторые проблемы с AsEnumerable, вместо этого я пытался переписать с помощью AsQuerable (). Думаю, я понял это. Спасибо, Син !! - person Roshan; 13.03.2020