我有两张桌子:Staff
& Address
。
这种关系是1比多(假设1名工作人员可以有多个地址)。
StaffId
++++++++++++++++++++++++++
1.商业、金融、商业、金融、商业、商业、金融、商业、金融、金融等行业的商业、金融、商业、金融、金融等行业。
2、商业、商业、金融等领域。
(3)成品率
AddressId
+++++++++++++++++++++++++++++++++++++++++++
1/1
2成品率
3
4
5
/T1666-1996技术、技术等方面的研究
为了获取员工信息和他们的地址,我在Address
表(Dapper )上使用了一个左联接查询。
然后我得到这样的数据,
AddressId
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1/1
2成品率-2
3、暗中性价廉
4-4
5成品率、成品率等
6/6机、机、工、技术等
如何使用AutoMapper和staffId嵌套分组将这些数据映射到下面的DTO?
public class StaffDto
{
public long StaffId { get; set; }
public string StaffName { get; set; }
public List<Address> Address { get; set; }
}
public class Address
{
public long AddressId { get; set; }
public string Address{ get; set; }
}
示例数据应该如下所示:
{
"staffId": 1,
"staffName": "Sarah",
"address":
[
{
"addressId": 1,
"street": "292 Oak Drive"
},
{
"addressId": 2,
"street": "560 Pine Garden Lane"
}
]
}
发布于 2020-11-19 09:24:58
让人有点困惑的是,你从一个地址加入到另一个员工,而不是其他方式,因为你不想要一个地址列表,而是一个员工和他们的地址列表。你根本不需要Automapper,Dapper为你做的很好。这应该能起作用:
var sql = "SELECT StaffId, StaffName. AddressId, Street FROM Staff INNER JOIN Address ON Staff.StaffId = Address.StaffId";
var staffDictionary = new Dictionary<int, StaffDto>();
var result = connection.Query<StaffDto, Adress, StaffDto>(sql,
(s, a) => {
StaffDto staff;
if (!staffDictionary.TryGetValue(s.StaffId, out staff))
{
staff = s;
staffDictionary.Add(staff);
}
staff.Address.Add(a);
return staff;
}, splitOn: "AddressId");
// Here are your staff
return staffDictionary;
这个想法是,如果你遇到一个“新”员工,你把它添加到字典中,否则你就会和你已经拥有的员工一起去。在所有情况下,地址都添加到工作人员中。你也许可以用你的左加入来完成这个任务,但我不明白你为什么会这样做。
发布于 2020-11-19 07:34:51
我查阅了许多方法和材料。由于在使用automapper时使用了多个循环,因此使用automapper无法满足这一要求。但是另一种方法被发现了。下面是一个例子。
根据您提供的模型,生成数据库。
以正常的方式获得Staffs
和Addresses
。然后,在循环中处理值。
public IActionResult get()
{
var staff = context.Staffs.ToList();
var address = context.Addresses.ToList();
foreach(var staf in staff)
{
staf.address = address.Where(x => x.StaffId == staf.StaffId).Select(x=> {
x.staffDto = null;
return x;
}).ToList();
}
return Ok(staff);
}
它就能得到那个结果。
https://stackoverflow.com/questions/64900192
复制相似问题