如何使用dapper映射多个列表

我有三个用户,订单和项目类存储在单个表中。 订单和项目都与用户有关系。 为了实现这一点,我有两个映射这些关系的crosstables(UserOrders,UserProjects)。

public class User { public string UserID {get;set;} public List Orders{get;set;} public List Projects {get;set;} } public class Order { public string OrderID {get;set} ... } public class Project { public string ProjectID {get;set} ... } 

如您所见,User对象包含每个相关orderID / projectID的列表。

现在我想用Dapper查询。 我有这个解决方案,只有一个列表工作得很好。 但是如果我尝试查询第二个列表的完整用户对象,我将得到每个结果乘以第一个列表中的结果数。 因此,如果用户获得3个订单和2个项目,则订单列表将很好,项目列表将包含两个项目3次:

 var lookup = new Dictionary(); var multi = dbDapperFM.Query("SELECT u.*, uo.OrderID, up.ProjectID "+ "FROM User u INNER JOIN UserOrders uo ON u.UserID=uo.UserID "+ "INNER JOIN UserProjects up ON u.UserID=up.UserID", (u, uo, up) => { User user; if (!lookup.TryGetValue(m.UserID, out user)) lookup.Add(u.UserID, user= u); if (user.Orders == null) user.Orders = new List(); user.Orders.Add(uo); if (user.Projects == null) user.Projects = new List(); user.Projects.Add(up); return user; }, splitOn: "UserID , OrderID, ProjectID ").AsQueryable(); 

我理解为什么会出现这个问题(2个内连接),但我真的没有办法解决它。

我也很难掌握Dapper不会自动执行此操作的事实。

首先,我不确定“splitOn”的逗号分隔值。 我以为你只能有一个价值。 因此,我的结果集中有多个列,名为“ID”。

其次,要获得正确的1:N关系,您需要执行额外的手动步骤。 例如,我做了一个2人加入的参与者和他们的电话号码。 然后我不得不这样做:

 private List CollapseResultSet(List rawdataset) { List ret = new List(); if (!rawdataset.Any()) { return ret; } else { List partIds = rawdataset.Select(p => p.ID).Distinct().ToList(); foreach (string pId in partIds) { Participant tmp = rawdataset.Where(p => p.ID == pId).FirstOrDefault(); tmp.PhoneNumbers = rawdataset.Where(p => p.ID == pId).Select(n => n.PhoneNumbers[0]).ToList(); ret.Add(tmp); } return ret; } } 

希望有所帮助。