Я пытаюсь перенести Web API с .NET Core 2.2 на .NET Core 3.0, и я наткнулся на следующее:
public Dictionary<int, Tag> GetTagMap(IList<int> tagIds = null)
{
var tags = context.Tag.AsNoTracking();
if (tagIds != null)
tags = tags.Where(t => tagIds.Contains(t.TagId));
return tags
.ToList() // explicit client evaluation in 3.0
.ToDictionary(t => t.TagId, t => t);
}
Это используется для генерации оператора SQL, подобного этому:
SELECT TagId, Name FROM Tag WHERE TagId IN (1, 2, 3)
, который очень хорошо работал для правильно проиндексированного столбца и небольшого числа значений IN
.
Теперь я получаю следующую ошибку, предполагающую, что перевод List<>.Contains
больше не поддерживается:
System.InvalidOperationException: 'выражение LINQ' Где (источник: DbSet, предикат: (t) => (необработанный параметр: __tagIds_0) .Contains (t.TagId)) 'не удалось перевести,Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsync (). Для получения дополнительной информации см. Оценка клиента и сервера - EF Core. '
Это говорит о том, что запросы LINQ больше не оцениваются на клиенте прерывистое изменение, но AFAIK Contains
былне оценивается на клиенте.