.Net의 DAM을 사용하여 복잡한 객체의 모든 부모 / 자식 데이터를 다시 가져 오는 방법

c# dapper multiple-resultsets

문제

나는 데이터베이스에서 하나의 (카테고리) - 많은 (제품) 관계를 가진이 두 개의 테이블을 가지고있다.

Table Product
    Name
    Description
    ProductCategory

Table Category
    Category
    Description

그리고이 수업들;

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

목록에 모든 제품 및 범주 개체 데이터가있는 목록을 가져 오려고합니다. multipleResults와 queryMultiple에 대해 읽었지만 두 가지를 묶는 방법을 알 수 없습니다. 나는 하나의 제품을 위해 그것을하는 방법을 안다. 그러나 그들의 개별 카테고리 객체를 가진 모든 제품에 대해서도 마찬가지다.

수락 된 답변

이런 식탁을 가지고 있다고 가정하십시오.

생성물

ID
ProductName
ProductCategoryID

범주

ID
CategoryName

수업

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

관련 코드가있는 제품 목록을로드하려면 아래 코드를 잘 수행해야합니다.

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

여기에 이미지 설명을 입력하십시오. 참고 : Dapper는 기본 키가 다르거 나 "Id"가 아닌 다른 위치에서 넓은 행을 분할하려는 경우 Id 열의 이름이 "Id"또는 "id"로 가정하고 선택적 'splitOn'매개 변수를 사용합니다.


인기 답변

이것은 당신이 원하는대로해야합니다 :

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

또한 Product 속성 중 하나에 대해 선택한 CategoryName 이름은 불편합니다.

나는 Product class를 다음과 같이 바꿀 것을 제안한다 :

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

그러면 쿼리가 더 깨끗해질 수 있습니다.

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.