Devuelve solo ciertas columnas / campos de la conexión Dapper. Consulta (sql)

c# dapper serialization web-services

Pregunta

El problema y la pregunta

Problema: pensé que connection.Query<myT>("Select A, C from myTable"); solo llenaría las columnas seleccionadas y los campos coincidentes de la clase / objeto subyacente. Pero parece que este no es el caso - (aunque la razón podría ser mi uso incorrecto o cómo serializo el resultado). Actualmente, todos los campos de la clase subyacente están en resultados serializados.

Preguntas: ¿Qué puedo hacer para devolver solo ciertas propiedades basadas en la selección y serializarlas?

La puesta en marcha

Basándome en A look at dapper, puse en común lo siguiente:

Una clase simple para la entidad / modelo:

public sealed class Category 
{
    public int Id { get; set; }
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime DateModified { get; set; }
}

IDbConnection y Dapper Repository Class

Devuelve un IDbConnection abierto

protected static IDbConnection OpenConnection()
{
    IDbConnection connection = new SqlConnection(ConnectionString);
    connection.Open();
    return connection;
}

utilice la conexión anterior con dapper en la clase de repositorio

public IEnumerable<Category> GetCategories()
{
    using (IDbConnection connection = OpenConnection())
    {
        const string sql = " SELECT Id, A, C FROM Categories";
        return connection.Query<Category>(sql);
    }
}

Serialice el resultado y envíelo al cliente por Asmx

[WebMethod]
public string GetCategoriesTreelist()
{
    var repo = new CategoryRepository();
    IEnumerable<Category> categories = repo.GetCategories();            
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    return serializer.Serialize(categories);
}

Salida

Actualmente, cada campo se serializa en lugar de solo los campos seleccionados de la declaración sql anterior.

  • ¿Qué puedo hacer para recuperar solo algunos campos?
  • ¿Es la razón por la que cada campo se serializa en base a dapper o en System.Web.Script.Serialization.JavaScriptSerializer() o se basa en mi malentendido / uso indebido?

Gracias

Actualizar después de que Marc respondió la pregunta

Perdiendo el bosque por los árboles: Como Marc dijo que Dapper no tiene parte, la serialización devuelve todos los miembros de los objetos. Esta simple prueba muestra que todos los miembros de la clase subyacente están serializados.

[WebMethod]
public string GetCategoriesTestObjectSerialization()
{

    List<Category> categoriesList =  new List<Category>(){
        new Category(){Id=1, A="a1", C="foo"},
        new Category(){Id=2, A="a2", C="bar"},
        new Category(){Id=3, A="a3", C="baz"}
    };
    IEnumerable<Category> categories= from c in categoriesList 
                                                where c.Id > 0
                                                select c;
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    return serializer.Serialize(categories);
}

La creación de un objeto simple de transferencia de datos resuelve el problema: categorías IEnumerable<CategoryDTO> categories= from c in categoriesList where c.Id > 0 select c;

private class CategoryDTO
{
    public int Id { get; set; }
    public string A{ get; set; }
    public string C{ get; set; }
}

Más sobre DTOs

Respuesta aceptada

Esto es fundamentalmente un factor de serialización. Dapper explícitamente nunca asigna a nada que no consiga en una columna. Sin embargo, sospecho que si serializas una new Category() verás un comportamiento muy similar. Opciones:

  • vive con ello
  • crea un modelo de DTO que se ajuste a lo que deseas, y consulta eso en su lugar
  • investigue si el serializador admite la serialización condicional (pero tenga en cuenta que esto puede requerir una gran repetición)


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow