Можно запросить свойство NotMapped? - PullRequest
0 голосов
/ 23 октября 2018

Сначала я работаю с кодом EF6, и я использовал этот ответ, чтобы сопоставить List<stirng> в моем праве.

Это мой класс

    [Key]
    public string SubRubro { get; set; } 
    [Column]        
    private string SubrubrosAbarcados
    {
        get
        {
            return ListaEspecifica == null || !ListaEspecifica.Any() ? null : JsonConvert.SerializeObject(ListaEspecifica);
        }
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                ListaEspecifica.Clear();
            else
                ListaEspecifica = JsonConvert.DeserializeObject<List<string>>(value);                
        }
    }

    [NotMapped]
    public List<string> ListaEspecifica { get; set; } = new List<string>();

Это прекрасно работает для хранения моего списка как Json, но теперь мне нужно выполнить запрос linq, и я пытаюсь это

var c = db.CategoriaAccesorios.Where(c => c.ListaEspecifica.Contains("Buc")).First();

И это выдает

System.NotSupportedException : указанный элемент типа 'ListaEspecifica' не поддерживается в LINQ to Entities.Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.

что логично.

Есть ли способ выполнить такой запрос?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Я смог сделать что-то подобное с помощью CompiledExpression .

using Microsoft.Linq.Translations;

// (...) namespace, class, etc

private static readonly CompiledExpression<MyClass, List<string>> _myExpression = DefaultTranslationOf<MyClass>
    .Property(x => x.MyProperty)
    .Is(x => new List<string>());

[NotMapped]
public List<string> MyProperty
{
    get { return _myExpression.Evaluate(this); }
}

Я надеюсь, что есть лучшие / более красивые решения;)

0 голосов
/ 23 октября 2018

Проблема здесь в том, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...