Renvoie uniquement certaines colonnes / champs de la connexion Dapper.Query (sql)

c# dapper serialization web-services

Question

Le problème et la question

Problème: je pensais que connection.Query<myT>("Select A, C from myTable"); ne remplirait que les colonnes sélectionnées et les champs correspondants de la classe / de l'objet sous-jacent. Mais il semble que ce ne soit pas le cas - (bien que la raison puisse être mon abus ou la façon dont je sérialise le résultat). Actuellement, tous les champs de la classe sous-jacente sont en résultat sérialisé.

Questions: Que puis-je faire pour ne renvoyer que certaines propriétés basées sur la sélection et les sérialiser?

La mise en place

Basé sur un regard sur Dapper je mets les éléments suivants ensemble:

Une classe simple pour l'entité / le modèle:

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; }
}

Classe de référentiel IDbConnection et Dapper

Retourne une IDbConnection ouverte

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

utiliser la connexion ci-dessus avec dapper dans la classe de référentiel

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

Serialze le résultat et l'envoyer au client par 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);
}

Sortie

Actuellement, chaque champ est sérialisé au lieu des champs sélectionnés dans l'instruction sql ci-dessus.

  • Que puis-je faire pour ne supprimer que quelques champs?
  • Est-ce que la raison pour laquelle chaque champ est sérialisé en fonction de dapper ou de System.Web.Script.Serialization.JavaScriptSerializer() ou de mon incompréhension / mauvaise utilisation?

Merci

Mise à jour après que Marc ait répondu à la question

Manquer la forêt pour les arbres: Comme Marc a dit que Dapper n'a aucun rôle à jouer dans le fait que la sérialisation renvoie tous les membres des objets. Ce test simple montre que tous les membres de la classe sous-jacente sont sérialisés.

[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);
}

Créer un simple objet de transfert de données résout le problème: 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; }
}

Plus sur les DTO

Réponse acceptée

C'est fondamentalement un facteur de sérialisation. Dapper n'attribue explicitement jamais rien à ce qu'il n'obtient pas dans une colonne. Cependant, je soupçonne que si vous sérialisez une new Category() vous verrez un comportement très similaire. Options:

  • vivre avec
  • créer un modèle DTO qui correspond à ce que vous voulez et interroger à la place
  • rechercher si le sérialiseur prend en charge la sérialisation conditionnelle (mais notez que cela peut nécessiter beaucoup de passe-partout)


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi