2011-02-08 28 views
8

podría señalar a alguien por qué esto podría estar sucediendo:C# comportamiento extraño lambda

estoy usando NHibernate y el proveedor Linq por ello.

El código que no está en la lista aquí:

var sequence = session.Query<T>(); 

var wtfSequence = sequence.Where(x => true); 
var okaySequence = sequence.Where(x => x.Id > 0); 

Depuración muestra que sequence (que es un IQueryable<T>) después de este contiene 2 elementos, que se añadieron a la base de datos.

Espero que la primera declaración Where arroje todos los elementos de esa secuencia, pero desafortunadamente deja 0 elementos.

(QUÉ ???)

El segundo Where comunicado, por el contrario, en realidad produce 2 elementos como debería funcionar.

Aquí están las consultas NHibernate -> Sqlite para la primera y la segunda declaración 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 pruebo el mismo código con mi InMemoryRepository, que almacena todas las entidades en una lista simple, el (x => true) funciona bien absolutelty.

Entonces, ¿por qué ocurre esto al usar NHibernate? ¿Es esto un error o estoy haciendo algo mal?

Gracias.

+2

Lo más probable es que esté relacionado con la forma en que NHibernate trata la Expresión que crea de la lambda, aunque sepas lo que está haciendo ... – Massif

Respuesta

5

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. Pruebe t => 1 == 1 en lugar de t => true, lo que podría funcionar según cómo se haya escrito el código NHibernate.

+1

De acuerdo. Y abra un ticket en http://jira.nhforge.org –

+0

http://216.121.112.228/browse/NHLQ-91 –

2

Supongo que esto es un error en NHibernate basado en la salida SqLite que muestra. Puede intentar X => X.Id == X.Id en lugar de X => true y ver si eso funciona.

1

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