Dapper Multi-map niveau suivant

dapper

Question

J'utilise plusieurs mappages pour une requête en cours et je dois maintenant mapper un autre objet sur la requête initiale.

Par exemple:

public class Part {
  public int Id { get; set; }
  public string Name { get; set; }

  public Address Address { get; set; }

}

public class Address {
  public int Id { get; set; }
  public string Street { get; set; }

  public SiteOu Ou { get; set; }
}

public class SiteOu 
  public int Id { get; set; }
  public string Name { get; set; }
}

Pimpant:

 connection.Query<Part, Address, Part>(sql, (part, address) => {
    part.Address = address;
  });

Comment puis-je obtenir la classe Address pour avoir les informations SiteOu?

Cet exemple n'est pas ce que je suis en train de faire parce que j'ai réellement

Query<T1,T2,T3,T4,T5,TResult>();  

Je fais 1 sélection et 5 jointures dans ma requête. J'espère donc que je n'ai pas besoin de plus de surcharges de requêtes.

Réponse acceptée

Dapper vous permet de mapper une seule ligne sur plusieurs objets, vous pouvez donc simplement mapper SiteOu dans le cadre de la même requête.

[Test]
public void TestSplitOn()
{
    var conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=true;Initial Catalog=db");
    conn.Open();
    const string sql = "select Id = 1, Name = 'My Part', " +
                       "Id = 2, Street = 'My Street', " +
                       "Id = 3, Name = 'My Site'";
    var result = conn.Query<Part, Address, SiteOu, Part>(sql, (part, address, siteOu) =>
    {
        part.Address = address;
        address.Ou = siteOu;
        return part;
    },
    commandType: CommandType.Text
    ).FirstOrDefault();

    Assert.That(result, Is.Not.Null);
    Assert.That(result.Address, Is.Not.Null);
    Assert.That(result.Address.Ou, Is.Not.Null);
}

Remarque importante: Dapper suppose que vos colonnes Id sont nommées "Id" ou "id", si votre clé primaire est différente ou si vous souhaitez diviser la ligne large au point autre que "Id", utilisez le paramètre facultatif "splitOn".

Si vous avez plus de 5 types à mapper, une autre option consiste à utiliser l'extension QueryMultiple. Voici un exemple tiré des documents Dapper.

var sql = 
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 

Consultez également ce fil .



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