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

Сообщение Re: Тормоза с запросом от 06.11.2023 14:30

Изменено 07.11.2023 14:29 VladD2

Re: Тормоза с запросом
Здравствуйте, merge!

Мне кажется, что вы не используете IQueriable в функциях CarSelectorCommon и CarSelectorLegal. Надо сделать так, чтобы они возвращали не bool, а IQueriable<Car>. Тогда SQL-запрос будет формироваться правильно.



M>Есть вот такой код вполне обычный.

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

M>SELECT * FROM Cars


M>и потом получается накладывается фильтр.

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

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

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

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

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


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



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

M>то есть просто такой код делаем

M>
M> var realCar = client.Type switch
M>    {
M>       Common => dbContext.Cars.FirstOrDefault(car => car.Country == client.Country &&        
M>              car.Model == client.Model &&
M>              car.SomeProperty = Client.SomeProperty),
M>           Legal => ...
M>        }
M>
Re: Тормоза с запросом
Здравствуйте, merge!

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

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

Мне кажется, что вы не используете IQueriable в функциях CarSelectorCommon и CarSelectorLegal. Надо сделать так, чтобы они возвращали не bool, а IQueriable<Car>. Тогда SQL-запрос будет формироваться правильно.