Comment récupérer toutes les données parent / enfant dans un objet complexe en utilisant dapper ORM dans .Net

c# dapper multiple-resultsets

Question

J'ai ces deux tables avec une relation (catégorie) à plusieurs (produit) dans la base de données

Table Product
    Name
    Description
    ProductCategory

Table Category
    Category
    Description

Et ces classes;

public class Product
{
  public string Name { get; set; }
  public string Description { get; set; }
  public Category CategoryName { get; set}    
}


public class Category
{
  public string CategoryName { get; set; }
  public string Description { get; set; }    
}

Je souhaite récupérer une liste avec toutes les données d'objet de produit et de catégorie dans une liste. J'ai lu à propos de multipleResults et queryMultiple mais je ne vois pas comment lier les deux ensemble. Je sais comment le faire pour un seul produit, mais qu'en est-il de tous les produits avec leurs objets de catégorie individuels?

Réponse acceptée

Supposons que vous ayez vos tables comme ça.

Produit

ID
ProductName
ProductCategoryID

Catégorie

ID
CategoryName

et vos cours

public class Product
{
    public int ID { set; get; }
    public string ProductName { set; get; }
    public int ProductCategoryID  {set;get;}
    public Category Category { set; get; }
}
public class Category
{
    public int ID { set; get; }
    public string CategoryName { set; get; }
}

Le code ci-dessous devrait fonctionner correctement pour vous permettre de charger une liste de produits avec des catégories associées.

var conString="Replace your connection string here";
using (var conn =   new SqlConnection(conString))
{
    conn.Open();
    string qry = "SELECT P.ID,P.ProductName,P.ProductCategoryID,C.ID,
                  C.CategoryName from Product P  INNER JOIN   
                  Category C ON P.ProductCategoryID=C.ID";
    var products = conn.Query<Product, Category, Product>
                     (qry, (prod, cat) => { prod.Category = cat; return prod; });

    foreach (Product product in products)
    {
        //do something with the products now as you like.
    }
    conn.Close(); 
}

entrer la description de l'image ici Remarque: 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".


Réponse populaire

Cela devrait faire ce que vous souhaitez:

var res = db.Query<Product, Category, Product>(
  @"select p.[Name], p.[Description], c.Category, c.Category as [CategoryName], c.Description
  from Product p
  inner join Category c on c.Category = p.ProductCategory",
  (prd, cat) => {
      prd.CategoryName = cat;
      return prd;
  },
  splitOn: "Category"
  ).AsQueryable();

En outre, le nom de Nom de CategoryName vous avez choisi pour l'une des propriétés du Product est incommode.

Je vous suggère de changer votre classe de Product comme ceci:

public class Product
{
   public string Name { get; set; }
   public string Description { get; set; }
   public Category Category { get; set; }    
}

Ensuite, la requête peut devenir plus propre:

var res = db.Query<Product, Category, Product>(
    @"select p.[Name], p.[Description], c.Category as [CategoryName], c.Description
      from Product p
      inner join Category c on c.Category = p.ProductCategory",
      (prd, cat) => {
          prd.Category = cat;
          return prd;
      },
      splitOn: "CategoryName"
      ).AsQueryable();



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