Composition Dapper.NET utilisant la même table

.net composition dapper orm

Question

J'ai une table mais j'aimerais la cartographier comme une composition entre deux classes.

Supposons que je dispose d'une table Customer avec les champs suivants: Id, Name, ExtraDataValue, ExtraDataDate.

class Customer
{
  public int Id {get;set;}
  public string Name {get;set;}
  public ExtraData Extra {get;set;}
}

class ExtraData
{
  public int Value {get;set;}
  public DateTime Date {get;set;}
}

Quelle est la meilleure façon de l'interroger et de remplir ExtraData dans l'objet Client?

Modifier:

Je vais étendre la question à un scénario plus complexe, car la réponse de XenoPuTtSs résout le premier mais ne fonctionnera pas avec celui-ci.

Supposons maintenant que j'ai une table d'adhésion à l'adresse. L'option splitOn divisera le résultat pour créer ExtraData mais ne parviendra pas à se séparer pour créer une adresse.

Je vois un autre problème en utilisant splitOn. Nous ne pouvons pas utiliser Select * en toute sécurité car si nous modifions la table avec plus de champs, nous devons toujours nous souvenir de déplacer les champs séparés en bas. Ou nous devrons toujours décrire tous les champs en ordre sûr dans la commande Sélectionner.

Réponse acceptée

splitOn: "Id, ExtraDataValue, Id" Je crois que cela répond à votre nouvelle version de la question. Vous avez maintenant une jointure à adresser et il remplit la partie adresse de votre objet client.

class Customer
{
  public int Id {get;set;}
  public int Name {get;set;}
  public ExtraData Extra {get;set;}
  public Address Address{get;set;} 
}

class ExtraData
{
  public int Value {get;set;}
  public int Date {get;set;}
}

class Address {
    public string line1{get;set;}
}

using (var conn = DatabaseService.CreateConnection())
{
    var t = conn.Query<Customer, ExtraData, Address, Customer>(@"
    select 
        c.cust_num as Id,
        c.cust_name as Name,
        c.ex_data1 as Value,
        c.ex_date as Date,
        a.*
    from Customer c
     join Address a on c.addressid = a.addressid
    ",
     (cust, extra, address) =>
     {
         cust.Extra = extra;
         cust.Address = address;
         return cust;
     },
    splitOn:"Id, Value, Id");
    return t;
}

Réponse populaire

Je cherchais juste ça pour moi. C'est ce que j'ai imaginé, changé pour votre scénario.

class Customer
{
  public int Id {get;set;}
  public int Name {get;set;}
  public ExtraData Extra {get;set;}
}

class ExtraData
{
  public int Value {get;set;}
  public int Date {get;set;}
}

using (var conn = DatabaseService.CreateConnection())
{
    var t = conn.Query<Customer, ExtraData, Customer>(@"
    select 
        cust_num as Id,
        cust_name as Name,
        ex_data1 as Value,
        ex_date as Date
    from Customer
    ",
     (cust, extra) =>
     {
         cust.Extra = extra;
         return cust;
     },
    splitOn: "Value");
    return t;
}



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