2011-09-17 9 views
11

Tengo una sencilla QueryOverQueryOver sencilla: no reconocido llamada al método

var q = SessionInstance.QueryOver<Person>().Where(p => p.Number.Equals(number)); 

tipo de campo Número es int. Esta consulta tiene un error de tiempo de ejecución por este mensaje:

no reconocido llamada de método: System.Int32: boolean equals (Int32)

+1

Se puede publicar el mapeo de 'Person'? también puedes probar '.Where (p => p.Number == number' –

+0

¡Gracias! El problema se resolvió mediante el reemplazo '==' leiu es igual. Lo que es diferente entre '==' y 'Igual' en el campo por int Tipo ? – Ehsan

Respuesta

27

El operador == genera una BinaryExpression que se puede convertir a SQL y la .Equals() método genera un MethodCallExpression que aparentemente es no convertido a SQL.

Por lo general, los operadores binarios se manejan en QueryOver y también en LINQ, pero sólo se trabaje con un par de llamadas de método (string.Contains, array.Contains, etc.) así que mejor los operadores su uso cuando sea posible.

Recuerde también que las llamadas a operadores/métodos no se ejecutan en realidad, sino que se convierten en sentencias de SQL, por lo que si tiene sustituciones/implementaciones personalizadas, es posible que no funcionen como se esperaba.

Por todo lo expuesto su código se escribiría como:

var q = SessionInstance.QueryOver<Person>().Where(p => p.Number == number); 
+0

Eso ahorró un par de trabajo aquí. Gracias – SadullahCeran

+0

¡Explicación impresionante, gracias! –

Cuestiones relacionadas