es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C# .Net EF 6.1 Utilizar la clase base de objetos como tipo de propiedad no mapea un objeto de la base de datos.

“Tengo un objeto Resultado que uso para mapear una consulta utilizada en varias tablas:

public class Resultado
{
public int Id{ get; set; }

//El valor puede ser bool, int, string, date
public object Valor { get; set; }

}

Llamadas a EF:

results.AddRange(context.Database.SqlQuery(“SELECT Id, Valor FROM ResultStrings”)).ToList());
results.AddRange(context.Database.SqlQuery(“SELECT Id, Valor FROM ResultInt”)).ToList());

La propiedad Id se llena, pero el Valor permanece nulo. ¿Hay alguna manera de llenar la propiedad Valor?”

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de poblar la propiedad Value. Dado que la propiedad Value puede tener diferentes tipos de datos (bool, int, string, date), necesitamos convertir explícitamente el valor devuelto por la consulta SQL al tipo de dato correcto. Podemos usar la propiedad Type del objeto Result para determinar el tipo de dato de la propiedad Value y luego utilizar el método de conversión apropiado.

    Aquí tienes un ejemplo de cómo poblar la propiedad Value para un entero:

    results.AddRange(context.Database.SqlQuery<result>("SELECT Id, CAST(Value AS INT) AS Value FROM ResultInt")).ToList());
    

    Esta consulta SQL utiliza la función CAST para convertir la columna Value a un entero. De manera similar, podemos utilizar la función CONVERT para convertir la columna Value a un tipo de dato diferente si es necesario.

    Nota que necesitamos actualizar la consulta SQL para cada tipo de dato que queremos consultar. Puede ser más eficiente utilizar una única consulta SQL que una las tablas ResultStrings y ResultInt y que incluya las conversiones adecuadas. Por ejemplo:

    results.AddRange(context.Database.SqlQuery<result>("SELECT Id, CASE DataType WHEN 'string' THEN CAST(Value AS NVARCHAR(MAX)) WHEN 'int' THEN CAST(Value AS INT) WHEN 'bool' THEN CAST(Value AS BIT) WHEN 'date' THEN CAST(Value AS DATE) END AS Value FROM Results JOIN DataTypes ON Results.DataTypeId = DataTypes.Id")).ToList());
    

    Esta consulta utiliza un join con una tabla DataTypes para determinar el tipo de dato de la columna Value y también incluye una declaración CASE para realizar la conversión adecuada. La ventaja de utilizar una única consulta es que solo necesitamos llamar a la base de datos una vez, lo cual puede mejorar el rendimiento.

Comments are closed.