2012-08-02 11 views
12

El Proc almacenado devuelve una columna con el valor 0 o 1 sin convertir a BIT. En mi POCO, si declaro el campo como¿Cuál es la forma más fácil de tratar la conversión de 0/1 a Falso/Verdadero en EF 4.x?

public bool MyColumn {get; set;} 

estoy recibiendo este error:

The specified cast from a materialized 'System.Int32' type to the 'System.Boolean' type is not valid. 

En realidad, esto tiene sentido ya que EF reconoce el valor devuelto como un entero.

Me pregunto si hay alguna manera fácil de (agregar anotación o usar api fluido quizás) convertir automáticamente 0/1 a Falso/Verdadero en el mapeo detrás de la escena sin tocar el Proc?

¡Gracias de antemano!

+4

Ya lo ha tocado. Convierta el valor de retorno en un BIT. –

+0

Boo es correcto. Si no tiene acceso al procedimiento almacenado para cambiar el tipo de devolución de la columna a bit, tendrá que cambiar el tipo de la propiedad a 'int', y luego verificar la igualdad a 0. – rossipedia

+0

tuve un problema similar a esto: al comienzo del proceso almacenado, había definido una tabla temporal con una columna de tipo Bit. Al devolver los resultados, estaba unificando una selección de la tabla temporal, con otra consulta donde el valor de la columna de bits acababa de establecerse en "0". Estaba obteniendo el mismo error que el anterior, y terminé resolviéndolo usando cast (bitcolumn como bit) - esto luego resolvió el error, y no tuve que cambiar el código para evitar esto. – hitch

Respuesta

12

Lo que puede hacer es tener otra propiedad para representar la representación booleana. Decorarlo con el atributo NotMapped para que EF no lo tenga en cuenta para el mapeo. Hacer y si condición y devolver true /false basado en el valor de Otra propiedad.

public Class Customer 
{ 

    [NotMapped] 
    public bool MyColumnBool 
    { 
     get 
     { 
     return (MyColumn ==1); 
     } 
    } 

    public int MyColumn {get; set;} 
    // other properties 

} 
+4

+1, aunque devolvería 'MyColumn! = 0' solo en caso de que la verdad sea realmente distinta de cero. – Tergiver

-3

Uso System.Convert.ToBoolean(int)

+0

Eso es fácil. Simplemente bifurque y actualice el código fuente de EF para hacerlo, y cuando se acepte su solicitud de extracción, EF automáticamente hará 'System.Convert.ToBoolean (int)' mientras materializa los resultados de la consulta. – ProfK

23

Otra opción es devolver un poco del procedimiento almacenado de manera que no es necesario echar nada en C# lado o utilizar cualquier decoración extraño. Esto significa que puede convertir el valor entero en BIT en T-SQL como lo hago a continuación:

select col1, col2, CONVERT(BIT, CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) as colWithBit 
FROM table1 
+4

Esta debería ser la respuesta aceptada ... – caesay

Cuestiones relacionadas