У нас есть требование искать заданный термин в строке, разделенной запятыми. Запрос построен таким образом, что он игнорирует возможные начальные и конечные пробелы в строке, разделенной запятыми. Я придумал следующий запрос, который отлично работает с EF 6.0.
var trimmedTags = tags.Select(t => t.Trim()); // List of tags we need to look for
return products.Where(p => trimmedTags.Any(t => ("," + p.Categories + ",").Contains("," + t + ",")) ||
trimmedTags.Any(t => ("," + p.Categories + ",").Contains(", " + t + ",")) ||
trimmedTags.Any(t => ("," + p.Categories + ",").Contains("," + t + " ,")) ||
trimmedTags.Any(t => ("," + p.Categories + ",").Contains(", " + t + " ,")));
Этот запрос больше не выполняется в EF Core 3.1 и выдает следующую ошибку:
System.InvalidOperationException: 'The LINQ expression 'DbSet<Product>
.Where(p => __trimmedTags_1
.Any(t => ("," + p.Categories + ",").Contains("," + t + ",")) || __trimmedTags_1
.Any(t => ("," + p.Categories + ",").Contains(", " + t + ",")) || __trimmedTags_1
.Any(t => ("," + p.Categories + ",").Contains("," + t + " ,")) || __trimmedTags_1
.Any(t => ("," + p.Categories + ",").Contains(", " + t + " ,")))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.'
В моей целевой таблице миллионы строк, поэтому оценка клиента, к сожалению, невозможна. Команда EF Core утверждает, что string.Contains
поддерживается, но я не могу понять, почему мой запрос внезапно дает сбой в EF Core.
trimmedTags
и построить дерево выражений, которое вы передаете методу.Where
. Вы можете генерировать продукты запроса. .Содержит(,тег3,)); и это должно работать нормально. - person dropoutcoder   schedule 14.03.2021ToList
было первым, что я попробовал, но безуспешно :( - person GETah   schedule 14.03.2021EF.Functions.Like
может помочь. Проблема не в функцииContains
, а в том, что она является частью вызоваtrimmedTags.Any(...)
, гдеtrimmdeTags
является коллекцией в памяти. И единственная поддерживаемая операция с коллекциями в памяти — этоCoontains
с примитивным значением. Итак, вы уверены, что решили свою проблему? - person Ivan Stoev   schedule 14.03.2021