Проблема здесь в том, что LINQ to Entities не понимает, как преобразовать ваш запрос в внутренний (SQL) язык.Поскольку вы не материализуете (т.е. не конвертируете в .NET) результаты запроса , пока не отфильтруете его, LINQ попытается преобразовать ваш запрос в сам SQL.Поскольку вы не знаете, как это сделать, вы получите NotSupportedException
.
. Если , вы сначала материализуете запрос (т. Е. Вызываете .ToList()
), а затем фильтруете, все будет работать нормально.Я подозреваю, что это не то, что вы хотите.(Т.е. db.CategoriaAccesorios.ToList().Where(c => c.ListaEspecifica.Contains("Buc")).First();
)
Поскольку этот ответ объясняет, что ваша проблема заключается в преобразовании EF в SQL.Очевидно, что вам нужен какой-то способ обойти это, однако.
Поскольку вы сериализуете JSON, на самом деле здесь есть пара опций, в частности использование LIKE
:
var c =
(from category
in db.CategoriaAccessorios
where SqlMethods.Like(c.SubrubrosAbarcados, "%\"Buc\"%")
select category).First()
Если EF Core, якобы, Microsoft.EntityFrameworkCore.EF.Functions.Like
должен заменить SqlMethods.Like
.
Если у вас SQL Server 2016+ и вынуждаете SubrubrosAbarcados
быть типом JSON, его можно использоватьнеобработанный запрос для непосредственного запроса столбца JSON, в частности.
Если вам интересен упомянутый аспект, вот пример того, как он может выглядеть в SQL Server 2016:
CREATE TABLE Test (JsonData NVARCHAR(MAX))
INSERT INTO Test (JsonData) VALUES ('["Test"]'), ('["Something"]')
SELECT * FROM Test CROSS APPLY OPENJSON(JsonData, '$') WITH (Value VARCHAR(100) '$') AS n WHERE n.Value = 'Test'
DROP TABLE Test