[英]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.