Информация об изменениях

Сообщение Тормоза с запросом от 06.11.2023 13:46

Изменено 06.11.2023 13:56 merge

Тормоза с запросом
Есть вот такой код вполне обычный.
Стал метод сильно тормозить. Смотрю в профайлере и вижу что идет запрос без условий, а просто

SELECT * FROM Cars


и потом получается накладывается фильтр.
То есть причина тормоза понятна. Непонятно, почему фильтр не накладывается? я думал, что до ToList\ToArray запрос собирается для базы. А получается что нет

        class DbContext
        {
      DbSet<Car> Cars { get; set; }
        }
        
somefunction()
       {
       Client client = GetClient();

        bool CarSelectorDatabase(Car car) => client.Type switch
        {
            Type.Common => CarSelectorCommon(car),
            Type.Legal => CarSelectorLegal(car),
            _ => throw new ArgumentOutOfRangeException()
        };     

        bool CarSelectorCommon(Car car) => client.IsVip()
            ? car.Country == client.Country &&        
              car.Model == client.Model &&
              car.SomeProperty = ClientCertificateOption.SomeProperty
            : car.Country == client.Country &&
              car.Model == client.Model;

        bool CarSelectorLegal(Car car) =>
            car.Country == client.Country &&
            car.Model == client.Model && 
            car.LegalZip == Client.LegalZip;


        var realCar = dbContext.Cars.FirstOrDefault(CarSelectorDatabase).ToList();
      }
Тормоза с запросом
Есть вот такой код вполне обычный.
Стал метод сильно тормозить. Смотрю в профайлере и вижу что идет запрос без условий, а просто

SELECT * FROM Cars


и потом получается накладывается фильтр.
То есть причина тормоза понятна. Непонятно, почему фильтр не накладывается? я думал, что до ToList\ToArray запрос собирается для базы.

  код
        class DbContext
        {
      DbSet<Car> Cars { get; set; }
        }
        
somefunction()
       {
       Client client = GetClient();

        bool CarSelectorDatabase(Car car) => client.Type switch
        {
            Type.Common => CarSelectorCommon(car),
            Type.Legal => CarSelectorLegal(car),
            _ => throw new ArgumentOutOfRangeException()
        };     

        bool CarSelectorCommon(Car car) => client.IsVip()
            ? car.Country == client.Country &&        
              car.Model == client.Model &&
              car.SomeProperty = Client.SomeProperty
            : car.Country == client.Country &&
              car.Model == client.Model;

        bool CarSelectorLegal(Car car) =>
            car.Country == client.Country &&
            car.Model == client.Model && 
            car.LegalZip == Client.LegalZip;


        var realCar = dbContext.Cars.FirstOrDefault(CarSelectorDatabase).ToList();
      }


И что самое интересное если сделать простой switch то работает всё шустро и в разы быстрее.
то есть просто такой код делаем

 var realCar = client.Type switch
    {
       Common => dbContext.Cars.FirstOrDefault(car => car.Country == client.Country &&        
              car.Model == client.Model &&
              car.SomeProperty = Client.SomeProperty),
           Legal => ...
        }