Soru NET'te dapper ORM kullanarak karmaşık nesne içindeki tüm ebeveyn / alt verileri nasıl geri çekilir


Veritabanında bir (kategori) ile bir çok (ürün) ilişkisine sahip bu iki tablo var.

Table Product
    Name
    Description
    ProductCategory

Table Category
    Category
    Description

Ve bu sınıflar;

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

Bir listedeki tüm ürün ve kategori nesne verileriyle bir liste almak istiyorum. MultipleResults ve queryMultiple hakkında okudum ancak ikisi birlikte nasıl bağlayacağımı göremiyorum. Tek bir ürün için nasıl yapılacağını biliyorum, ancak bireysel ürün kategorileriyle birlikte tüm ürünler hakkında ne söyleyebilirim.


18
2017-12-20 19:12


Menşei




Cevaplar:


Masalarını böyle aldığını varsayalım.

Ürün

ID
ProductName
ProductCategoryID

Kategori

ID
CategoryName

ve sınıfların

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

Aşağıdaki kodlar, ilişkili kategorilere sahip ürünlerin listesini yüklemeniz için iyi çalışmalıdır.

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

enter image description here Not :  Dapper, Kimlik anahtarlarınızın "Kimlik" veya "kimlik" olarak adlandırıldığını, birincil anahtarın farklı olması veya "Satır" dışındaki bir satırda geniş satırın bölünmesini istiyorsanız, isteğe bağlı 'splitOn' parametresini kullanın.


19
2017-12-20 22:23





Bu istediğini yapmalı:

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();

Ayrıca CategoryName biri için seçtiğiniz adı ProductÖzellikleri rahatsız edici.

Seni değiştirmeni öneriyorum Product sınıf böyle:

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

Sonra sorgu daha temiz hale gelebilir:

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();

6
2017-12-20 21:15