Carte Dapper avec préfixe dans le nom de la colonne

c# dapper

Question

J'ai 2 classes, ordre et adresse comme suit:

public class Order
{
    public string OrderId { get; set; }
    public Address ShippingAddress { get; set; }
    public Address BillingAddress { get; set; }
}

et

public class Address
{
    public string Street { get; set; }
    public string Town { get; set; }
    public string Zip { get; set; }
}

La base de données stocke les commandes et l'adresse dans une seule table comme ceci:

CREATE TABLE Orders
    (
        OrderId NVARCHAR(56) PRIMARY KEY,
        BillingStreet NVARCHAR(256),
        BillingTown NVARCHAR(256),
        BillingZip NVARCHAR(256),
        ShippingStreet NVARCHAR(256),
        ShippingTown NVARCHAR(256),
        ShippingZip NVARCHAR(256)
    )

entrer la description de l'image ici

Comment puis-je obtenir que Dapper mappe ceci à la classe Order?

Réponse acceptée

Voici comment procéder en généralisant la requête pour les colonnes de facturation et d'expédition et en utilisant la version de Query qui prend plusieurs types et en lui indiquant de se séparer lorsqu'il voit une colonne appelée "Adresse". Ensuite, il vous suffit d'affecter les objets Address à la propriété appropriée de l'objet Order .

connection.Query<Order, Address, Address, Order>(
    @"SELECT OrderId, 
             BillingAddress As Address, 
             BillingTown As Town, 
             BillingZip As Zip, 
             ShippingAddress As Address, 
             ShippingTown As Town, 
             ShippingZip As Zip,  
      FROM Orders",
    (o, ba, sa) =>
    {
        o.BillingAddress = ba;
        o.ShippingAddress = sa;
        return o;
    },
    splitOn: "Address");

Réponse populaire

Je ne pense pas que ce soit possible avec Dapper car il traite les lignes comme un seul objet. Il serait possible de changer la structure de votre table:

CREATE TABLE Orders
(
    OrderId NVARCHAR(56) PRIMARY KEY,
    BillingAddressId INT
    ShippingAddressId INT
)

Ensuite, vous devrez changer de classe pour:

public class Order
{
    public string OrderId { get; set; }
    public int ShippingAddressId {get; set;}
    public virtual Address ShippingAddress { get; set; }
    public int BillingAddressId {get; set;}
    public virtual Address BillingAddress { get; set; }
}

Et juste utiliser multi mapping.

Une autre option consiste à utiliser les extensions Dapper telles que Dapper-FluentMap ou Dapper Extensions qui vous aideront à mapper des colonnes vers des classes.




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