Запрос LINQ работает нормально в Dot Net Core 2.2, но в 3.1 - PullRequest
0 голосов
/ 05 мая 2020

Ниже запрос LINQ работает, как ожидалось, в Dot Net Core 2.2, но когда я обновился до 3.1, он вызывает выполнение во время выполнения.

[HttpGet("{SINo}")]
public async Task<IEnumerable<dynamic>> SaleHistory(string SINo)
{
    return await (from s in _context.Sales
                  where s.saleInvNo.Contains("|")
                        ? s.saleInvNo.Split("|", StringSplitOptions.None)[1] == SINo
                        : s.saleInvNo == SINo
                  select new
                  {
                      s.saleDate,
                      s.saleInvNo
                  }).ToListAsync();
}

не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена, либо переключитесь на оценку клиента явно, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ()

Как я могу изменить этот переводимый запрос?

Примечание. В таблице продаж ~ 1 миллион записей. Из этого я просто хочу получить одну запись.

1 Ответ

1 голос
/ 05 мая 2020

string.Split не поддерживается в LINQ to Entities. Так что вам нужно использовать Substring и IndexOf вместе, как показано ниже.

Используйте:

s.saleInvNo.Substring(s.saleInvNo.IndexOf("|") + 1) == SINo

Вместо:

s.saleInvNo.Split("|", StringSplitOptions.None)[1] == SINo

См.: Разделить вложенный из в Entity Framework

Кстати, вы должны рассмотреть @ DavidG предложение:

Также, глядя на этот запрос, я настоятельно Предлагаем вам нормализовать эти данные, чтобы разделить значение «SINNo» в отдельный столбец - нет отличного способа запросить этот стиль данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...