query icriterion c# linq nhibernate lambda iqueryable

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.