Запрос к DBcontext с использованием объекта значения явно возвращает оценку клиента в EFCore 3.1.

У меня есть эта модель, как вы можете видеть здесь:

public  class car
    {
        public int Id { set; get; }
        public string Name { set; get; }
        public CarBody CarBody { get; set; }

        public car( string name, CarBody carBody)
        {

            Name = name;
            CarBody = new CarBody(carBody.VIN);
        }
        private car()
        {

        }
    }

И внутри этого класса car у меня есть еще один объект значения с именем CarBody

   public class CarBody
{
    public VIN VIN { get; set; }

    public CarBody(VIN vin)
    {
        VIN = vin;
    }

    private CarBody()
    {

    }
}

И модель ВИН

public class VIN
    {
        public string value { get; set; }

        public VIN(string value)
        {
            this.value = value;
        }

        private VIN()
        {

        }
    }

Мне нужно выполнить запрос, используя EFCORE 3.1 на VIN внутри CarBody, как вы можете видеть здесь:

  public Domain.PetrolReceptions.PetrolReception GetLastOpenNotCanceledByVIN(string vin,
        double openPetrolTestTimeInDays)
    {


        var result = _dbContext.PetrolReceptions.Where(g =>g.Car.carBody.vin == vin ).ToList();

        return result.FirstOrDefault();
    }

Но после выполнения запроса я получил эту ошибку:

The LINQ expression 'DbSet<PetrolReception>
    .Where(p => p.Car.carBody.vin == __vin_0)' 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.

Вот конфигурация configEntity

 public  class CarConfig : IEntityTypeConfiguration<car>
    {

        public void Configure(EntityTypeBuilder<car> builder)
        {
            builder.Property(c => c.CarBody).HasConversion(c => JsonConvert.SerializeObject(c),
                c => JsonConvert.DeserializeObject<CarBody>(c));

        }
    }

Заранее спасибо.


person Ehsan Akbar    schedule 10.05.2020    source источник
comment
На картинке не хватает многих вещей - Money, CarBrand, Year, CarColor, PlaqueCode. Исключение их из модели и настройка Car и CarBody в качестве принадлежащих типов сущностей приводит к другому исключению. Не найден подходящий конструктор для типа сущности "Автомобиль". Добавление класса private Car() { } к классу Car не является исключением, т.е. в обоих случаях проблема не может быть воспроизведена. Предоставьте минимальный воспроизводимый пример.   -  person Ivan Stoev    schedule 10.05.2020
comment
@IvanStoev У меня такие же проблемы с деньгами и другими моделями, но в моем примере я описываю VIN \   -  person Ehsan Akbar    schedule 10.05.2020
comment
Я тебе верю, но не могу воспроизвести. Обновите свой пример таким образом, чтобы мы могли скопировать/вставить модель + fluent-конфигурацию (если есть) в чистый проект, запустить запрос и получить рассматриваемое исключение. По-видимому, у вас есть проблема, но без репродукции мы не можем сказать вам, что ее вызывает и как ее решить.   -  person Ivan Stoev    schedule 10.05.2020
comment
@IvanStoev Спасибо, Иван, я редактирую свой пост на простом примере.   -  person Ehsan Akbar    schedule 10.05.2020
comment
Ага, преобразователь значений Json (я предполагал, что объект принадлежит). Извините, с точки зрения EF/db, p.Car — это всего лишь string, поэтому любые методы доступа к свойствам внутри не могут быть переведены в SQL. Таким образом, оценка клиента является единственным вариантом. За исключением случаев, когда вы используете SqlServer и каким-то образом используете функцию JSON_VALUE (здесь заголовок stackoverflow.com/questions/52017204/ вы можете увидеть, как его включить). В целом хранение Json в реляционной базе данных — плохая идея, особенно с учетом отсутствия типа данных Json в EF Core.   -  person Ivan Stoev    schedule 10.05.2020
comment
@IvanStoev Могу ли я использовать dapper?   -  person Ehsan Akbar    schedule 10.05.2020
comment
Эй, это требует большого расширения вопроса. Но, по сути, ответ на проблему - это сравнение на равенство... `carbody.Vin является объектом`, а переданное значение является строкой; Я предполагаю, что это vinNumber, а не Vin. Думайте о Vin как об объекте (содержит номер и связанные с ним атрибуты), где string vin на самом деле является vinNumber. Другими словами, вы Ehsan Akbar (человек), а ваше имя Ehsan Akbar - вы человек не равное вам имя (если человек == имя).   -  person mrdnk    schedule 11.05.2020


Ответы (1)


Наконец, собственный тип используется в EFCORE 3.1, потому что, как я обнаружил, EFCORE3.1 его не поддерживает.

  public  class CarConfig : IEntityTypeConfiguration<car>
    {

        public void Configure(EntityTypeBuilder<car> builder)
        {
            builder.OwnsOne(c => c.CarBody).OwnsOne(c => c.VIN);

        }
    }

Спасибо .

person Ehsan Akbar    schedule 11.05.2020