c# - icriterion - nhibernate isqlquery
C#extraño comportamiento lambda (3)
¿Podría alguien señalar por qué esto podría estar pasando?
Estoy usando NHibernate
y el proveedor de Linq
para eso.
El código que falla se enumera aquí:
var sequence = session.Query<T>();
var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);
La depuración muestra esa sequence
(que es una IQueryable<T>
) después de que contiene 2 elementos, que se agregaron a la base de datos.
Espero que la primera sentencia Where
arroje todos los elementos de esa secuencia, pero desafortunadamente deja 0 elementos.
(¿¿¿POR QUÉ???)
El segundo enunciado Where
, por el contrario, en realidad produce 2 elementos como debería funcionar.
Aquí están las consultas de NHibernate -> Sqlite
para la primera y la segunda declaración de Where
.
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0=''true'';@p0 = ''True'' [Type: String (0)]
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)]
Ahora, si InMemoryRepository
el mismo código con mi InMemoryRepository
, que almacena cada entidad en una lista simple, el (x => true)
funciona perfectamente.
Entonces, ¿por qué sucede esto al usar NHibernate
? ¿Es esto un error o estoy haciendo algo mal?
Gracias.
No sé NHibernate, pero el problema es obvio desde el SQL generado: su base de datos no considera verdadero (t minúscula) igual a True (T mayúscula). En el servidor SQL puede cambiar esto modificando la intercalación de la base de datos (lo cual es una idea realmente mala a menos que desee insensibilidad a las mayúsculas y minúsculas por otros motivos).
Supongo que este es un error en NHibernate que necesita solucionar. Pruebe t => 1 == 1
lugar de t => true
, lo que podría funcionar según cómo se escriba el código NHibernate.
Parece un error para mí. Está convirtiendo una operación booleana en una evaluación de cadena, e incluso eso está mal, ya que configura la consulta con true
y evalúa el uso de True
, por lo que una prueba sensible a mayúsculas y minúsculas fallaría.
Supongo que esto es un error en NHibernate basado en la salida SqLite que muestra. Podría intentar X => X.Id == X.Id
vez de X => true
y ver si eso funciona.