簡體   English   中英

Dapper 一對多關系映射

[英]Dapper one to many relationship mapping

我正在嘗試 map 與小巧玲瓏的一對多關系。 但我沒有讓它工作。

我有一個表order和另一個產品order_product

現在我有這段代碼:

var sql = @"SELECT 
* 
FROM `order` o
INNER JOIN `order_product` op ON op.order_id = o.order_id
WHERE o.order_id = 5153";
var products = await connection.QueryAsync<Order, OrderProduct, Order>(sql, (order, product) =>
{
    if (order.Products == null)
    {
        order.Products = new List<OrderProduct>();
    }

    if (product != null)
    {
        order.Products.Add(product);
    }

    return order;
}, splitOn: "order_id");

出於測試目的,我加載了包含 4 個產品的 ID 為 5153 的訂單。

class OrderProduct 定義為:

public class OrderProduct
    {
        public int order_product_id { get; set; }
        public int order_id { get; set; }
        public int product_id { get; set; }
        public string name { get; set; }
        public string model { get; set; }
        public int quantity { get; set; }
        public decimal price { get; set; }
        public decimal total { get; set; }
        public decimal tax { get; set; }
        public int reward { get; set; }
    }

訂單 class 包含訂單表中的所有屬性 +

public ICollection<OrderProduct> Products { get; set; } 

但是,我得到 4 個 Order 對象,而不是 1 個 Order object 和 4 個 OrderProduct 對象,其中每個對象包含 4 個中的一個產品。

有人知道我在這里做錯了什么嗎?

試試這樣:

        var sql = @"SELECT * FROM `order` o 
              INNER JOIN `order_product` op ON op.order_id = o.order_id
            WHERE o.order_id = 5153";
        var orderDictionary = new Dictionary<int, Order>();
        var products = await connection.QueryAsync<Order, OrderProduct, Order>(sql, (order, product) =>
        {
            if (!orderDictionary.TryGetValue(order.order_id, out Order docEntry))
            {
                docEntry = order;
                docEntry.Products = new List<OrderProduct>();
                orderDictionary.Add(docEntry.order_id, docEntry);
            }

            if (product != null) docEntry.Products.Add(product);
            docEntry.Products = docEntry.Products.Distinct().ToList();

            return docEntry;
        }
        , splitOn: "order_id");

你在 orderDictionary 上得到了訂單列表,如果你只想要一個列表,就這樣獲取

var orderList = orderDictionary.Values.ToList();

select * 對於生產查詢來說是個壞主意,您需要確保您的 order_id 列是 splitOn 列,並且您有兩個,通常 Dapper 會完成他的工作並嘗試猜測哪個是拆分器,但如果您修復會更好它通過別名其中之一

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM