Pregunta C # extraño comportamiento lambda


¿Podría alguien señalar por qué esto podría estar pasando?

estoy usando NHibernate y el Linq proveedor para ello.

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 que sequence (que es un IQueryable<T>) después de esto contiene 2 elementos, que se agregaron a la base de datos.

Espero que el primero Where declaración para producir todos los elementos de esa secuencia, pero desafortunadamente deja 0 elementos. 

(¿¿¿POR QUÉ???)

El segundo Where declaración, por el contrario, en realidad produce 2 elementos, ya que debería funcionar.

Aquí están los NHibernate -> Sqlite consultas para el primero y segundo Where declaraciones.

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 pruebo el mismo código con mi InMemoryRepository, que almacena cada entidad en una lista simple, el (x => true) funciona absolutamente bien.

Entonces, ¿por qué sucede esto cuando se usa NHibernate? ¿Es esto un error o estoy haciendo algo mal?

Gracias.


8
2018-02-08 15:02


origen


Respuestas:


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 de mayúsculas / minúsculas por otros motivos).

Supongo que este es un error en NHibernate que necesita solucionar. Prueba t => 1 == 1 en lugar de t => true, lo que podría funcionar según cómo esté escrito el código NHibernate.


5
2018-02-08 15:10



Supongo que esto es un error en NHibernate basado en la salida SqLite que muestra. Tu podrías intentar X => X.Id == X.Id más bien que X => true y mira si eso funciona


2
2018-02-08 15:05



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 True, por lo que una prueba sensible a mayúsculas y minúsculas fallaría.


1
2018-02-08 15:11