가장 좋은 방법은 대담한 닷넷 ORM과 일대 다 관계를 추출하는 것입니까?

c# dapper one-to-many orm

문제

나는 '제품'과 '판매자'라는 두 가지 클래스를 가지고 있습니다.

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public Seller Seller { get; set; }
    public int? SellerId { get; set; }
}
public class Seller
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}

나는 dapper를 사용하여 모든 제품을 가진 Seller 목록을 추출하려고합니다.

현재 나는 이렇게하고있다.

Dictionary<int, Seller> dic = new Dictionary<int, Seller>();
        Conn.Query<Seller, Product, int>
            (@"select s.*,p.* from Sellers s Join Products p 
                on p.SellerId = s.Id",
            (s, p) => {
                if (dic.ContainsKey(s.Id))
                    dic[s.Id].Products.Add(p);
                else
                {
                    s.Products = new List<Product>();
                    s.Products.Add(p);
                    dic.Add(s.Id, s);
                }
                return s.Id; 
            });
        var sellers = dic.Select(pair => pair.Value);

더 좋은 방법이 있습니까?

수락 된 답변

데이터를 어떻게 사용하고 싶은지 혼합하는 방법을 혼합하고 있다고 생각합니다. 나는 당신의 데이터베이스를 표준화 할 것을 제안 할 것이다.

//Normalized Database classes
public class Seller
{
    public int Id { get; set; }  // primary key
    public string Name { get; set; }
}

public class Product
{
    public int Id { get; set; }  // primary key
    public int SellerId { get; set; } // foreign key
    public string Name { get; set; }
    public decimal Price { get; set; }
}

그런 다음 판매자 W 제품 테이블을 직접 u 리할 수 있습니다.

var Sellers = connection.Query<Seller>("Select * from Seller");
var Products = connection.Query<Product>("Select * from Product");

그런 다음 linq "group by"을 사용하여 Product를 사전에 추가하십시오.

var SellerWithProductsDict = 
        (from prod
        in Products 
        group prod by prod.SellerId
        into groupedProducts
        select groupedProducts)
        .ToDictionary(gp => gp.SellerId, gp => gp.ToList());

그런 다음 SellerWithProductsDict를 반복하여 모든 판매자 제품을 볼 수 있으며, 판매자 이름이 필요한 경우 Sellers 쿼리 결과의 색인으로 가져올 수 있습니다.

***************************************

그 대답의 끝이지만 판매자와 섞인 제품이 정말로 필요하다면 위의 동일한 데이터베이스 구조를 사용하여 다음과 같이 할 수 있습니다.

var qry = @"Select s.Id as SellerId,
                   s.Name as SellerName,
                   p.Id as ProductId,
                   p.Name as ProductName,
                   p.Price as ProductPrice
            From Seller as s, Product as p
            Where s.Id = p.id"

var SellerWithProducts = connection.Query(qry)

그런 다음 linq "group by"함수를 사용하여이를 사전에 던집니다. 나는이 " Linq group-by 여러 필드 "게시물 linq에 의해 그룹에 도움을 찾고 제안 것이


인기 답변

내 마지막 게시물이 어떤 이유로 미쳐 버렸습니다.

우선, 데이터베이스에서 모든 것을 가져 오는 것이 좋지 않을 수도 있습니다. 조회를 제한하는 것이 좋습니다. 비록 당신의 식탁이 지금은 작을지라도, 당신은 벽에 등을 돌리고 싶지 않습니다.

그 말을 듣고, 판매자와 제품에 정적 메소드를 추가하여 판매자와 제품을 얻는 코드를 단순화하는 것이 좋습니다.

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public int? SellerId { get; set; }
    public Seller Seller { get; set; }

    public static Product GetProductById(int id)
    {
        Product product = null;
        using (SqlConnection connection = new SqlConnection("connectionString"))
        {
            product = connection.Query<Product>("select * from Product where Id = @Id", new { Id = id }).SingleOrDefault();
            product.Seller = connection.Query<Seller>("select * from Seller where Id = @Id", new { Id = product.SellerId }).SingleOrDefault();
        }

        return product;
    }
}

public class Seller
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }

    public static Seller GetSellerById(int id)
    {
        Seller seller = null;
        using (SqlConnection connection = new SqlConnection("connectionString"))
        {
            seller = connection.Query<Seller>("select * from Seller where Id = @Id", new { Id = id }).SingleOrDefault();
            if(seller != null)
            {
                seller.Products = connection.Query<Product>("select * from Product where SellerId = @Id", new { Id = id }).ToList();
                seller.Products.ForEach(p => p.Seller = seller);
            }
        }

        return seller;
    }
}

명심해야 할 것은 이것이 거칠고 필요한 모든 것을 의미하지는 않지만 장기적으로 사용하는 것이 더 쉽고 데이터를 가져 오기 위해 쿼리 중 하나를 만드는 것보다 객체 지향 디자인을 더 잘 따른다는 점을 명심하십시오.

GetSellersInZipCode (int zipCode)와 같은 판매자 또는 제품에 대한 다른 정보를 쿼리하고 해당 메소드를 통해 List를 반환하는 메소드를 추가하여이 아이디어를 더욱 확장 할 수 있습니다.



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