gpt4 book ai didi

c# - Dapper 一对多关系映射

转载 作者:行者123 更新时间:2023-12-05 04:32:49 30 4
gpt4 key购买 nike

我正在尝试用 dapper 映射一对多关系。但我无法正常工作。

我有一个表 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 的订单。

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

订单类包含订单表中的所有属性+

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

但是,我得到的不是 1 个 Order 对象和 4 个 OrderProduct 对象,而是 4 个 Order 对象,每个对象包含 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上得到了订单List,如果你只想要一个列表,就这样获取

var orderList = orderDictionary.Values.ToList();

select * 对于生产查询来说是个坏主意,您需要确保您的 order_id 列是 splitOn 列,并且您有两个,通常 Dapper 会完成他的工作并尝试猜测哪个是拆分器,但更好如果你通过给其中之一起别名来修复它

关于c# - Dapper 一对多关系映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71586133/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com