Como mapeio várias listas com o dapper
Eu tenho três classes Usuário, Pedido e Projeto, que são armazenadas em tabelas únicas. Os pedidos e os projetos têm uma relação n: n com os usuários. Para implementar isso, eu tenho duas tabelas cruzadas (UserOrders, UserProjects) que mapeiam essas relações.
public class User
{
public string UserID {get;set;}
public List<string> Orders{get;set;}
public List<string> Projects {get;set;}
}
public class Order
{
public string OrderID {get;set}
...
}
public class Project
{
public string ProjectID {get;set}
...
}
Como você pode ver, o objeto Usuário contém uma lista de todos os orderID / projectID relacionados.
Agora eu quero consultar isso com o Dapper. Eu tenho essa solução que funciona muito bem com1 Lista. Mas se eu tentar consultar o objeto de usuário completo para a 2ª lista, todos os resultados serão multiplicados pelo número de resultados na primeira lista. Portanto, se um usuário tiver 3 pedidos e 2 projetos, a lista de pedidos ficará bem e a lista de projetos conterá os dois projetos três vezes:
var lookup = new Dictionary<string, User>();
var multi = dbDapperFM.Query<User, string, string, User>("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<string>();
user.Orders.Add(uo);
if (user.Projects == null)
user.Projects = new List<string>();
user.Projects.Add(up);
return user;
}, splitOn: "UserID , OrderID, ProjectID ").AsQueryable();
Entendo por que esse problema ocorre (2 junções internas), mas não entendo como resolvê-lo.