gpt4 book ai didi

c# - Dapper 中多重映射的正确使用

转载 作者:行者123 更新时间:2023-12-03 04:50:48 28 4
gpt4 key购买 nike

我正在尝试使用 Dapper 的多重映射功能返回 ProductItems 和关联客户的列表。

[Table("Product")]
public class ProductItem
{
public decimal ProductID { get; set; }
public string ProductName { get; set; }
public string AccountOpened { get; set; }
public Customer Customer { get; set; }
}

public class Customer
{
public decimal CustomerId { get; set; }
public string CustomerName { get; set; }
}

我的 Dapper 代码:

var sql = @"select * from Product p 
inner join Customer c on p.CustomerId = c.CustomerId
order by p.ProductName";

var data = con.Query<ProductItem, Customer, ProductItem>(
sql,
(productItem, customer) => {
productItem.Customer = customer;
return productItem;
},
splitOn: "CustomerId,CustomerName"
);

这工作正常,但我似乎必须将完整的列列表添加到“splitOn”参数中才能返回所有客户的属性。如果我不添加“CustomerName”,它将返回 null。我是否误解了多重映射功能的核心功能?我不想每次都添加完整的列名称列表。

最佳答案

我刚刚运行了一个运行良好的测试:

var sql = "select cast(1 as decimal) ProductId, 'a' ProductName, 'x' AccountOpened, cast(1 as decimal) CustomerId, 'name' CustomerName";

var item = connection.Query<ProductItem, Customer, ProductItem>(sql,
(p, c) => { p.Customer = c; return p; }, splitOn: "CustomerId").First();

item.Customer.CustomerId.IsEqualTo(1);

需要指定 splitOn 参数作为分割点,默认为 Id。如果有多个分割点,您需要将它们添加到逗号分隔的列表中。

假设您的记录集如下所示:

ProductID | ProductName | AccountOpened | CustomerId | CustomerName ---------------------------------------   -------------------------

Dapper 需要知道如何按此顺序将列拆分为 2 个对象。粗略一看,客户从 CustomerId 列开始,因此 splitOn: CustomerId

如果基础表中的列排序由于某种原因发生翻转,这里有一个警告:

ProductID | ProductName | AccountOpened | CustomerName | CustomerId  ---------------------------------------   -------------------------

splitOn: CustomerId 将导致客户名称为空。

如果您指定 CustomerId,CustomerName 作为分割点,dapper 会假设您尝试将结果集分割为 3 个对象。第一个从头开始,第二个从 CustomerId 开始,第三个从 CustomerName 开始。

关于c# - Dapper 中多重映射的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472088/

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