Estamos tratando de actualizar nuestro proyecto a .net core 5. Y ahora estamos luchando con un comportamiento extraño de EF. Una consulta sencilla:
context.Set<Order>().Where(o => o.Archived == false)donde Order.Archived es bit NOT NULL en la base de datos, genera una consulta de este tipo:
select * from Order where Archived <> CAST(1 as bit)¿Por qué pasó esto? En su lugar, esperamos tener una consulta como la siguiente:
select * from Order where Archived = CAST(0 as bit)Dicha inversión puede impedir que la base de datos utilice índices adecuados en consultas más complejas. ¿Hay alguna manera de hacer que EF genere una consulta más directa?
PD: También probamos este mismo enfoque con campos anulables. Y allí sí recibimos la consulta esperada.
Investigué esto y para las propiedades anulables funciona bien, como se esperaba. Para propiedades que no aceptan valores NULL, encontré este truco, que da el resultado esperado
context.Set<Order>().Where(o => new []{false}.Contains(o.Archived))En ese caso, recibimos la siguiente consulta sql:
select * from Order where Archived = CAST(0 as bit)