Nuestros mejores investigadores han agotado sus depósitos de café, en su búsqueda día y noche por la solución, hasta que Alexandría halló la respuesta en Bitbucket y hoy la compartimos contigo.
Solución:
Hice lo mejor que pude y lo resolví.
Aquí está la solución más fácil y precisa según mi:
var lookup = new Dictionary();
var lookup2 = new Dictionary();
connection.Query(@"
SELECT o.*, ol.*, ols.*
FROM orders_mstr o
INNER JOIN order_lines ol ON o.id = ol.order_id
INNER JOIN order_line_size_relations ols ON ol.id = ols.order_line_id
", (o, ol, ols) =>
OrderDetail orderDetail;
if (!lookup.TryGetValue(o.id, out orderDetail))
lookup.Add(o.id, orderDetail = o);
OrderLine orderLine;
if (!lookup2.TryGetValue(ol.id, out orderLine))
lookup2.Add(ol.id, orderLine = ol);
orderDetail.OrderLines.Add(orderLine);
orderLine.OrderLineSizes.Add(ols);
return orderDetail;
).AsQueryable();
var resultList = lookup.Values.ToList();
No sé qué es la clase ‘OrderDetail’, no la proporcionas, así que usé la clase Order.
Esto también se puede hacer QueryMultiple pero debido a que su pregunta incluye INNER JOIN, no lo uso.
public Dictionary GetOrderLookup()
orders.Count == 0)
return lookup;
foreach (var order in orders)
var contians = lookup.ContainsKey(order.id);
if (contians)
var newLinesToAdd = new List();
var existsLines = lookup[order.id].OrderLines;
foreach (var existsLine in existsLines)
foreach (var newLine in order.OrderLines)
if (existsLine.id == newLine.id)
existsLine.OrderLineSizes.AddRange(newLine.OrderLineSizes);
else
newLinesToAdd.Add(newLine);
existsLines.AddRange(newLinesToAdd);
else
lookup.Add(order.id, order);
return lookup;
Decidí usar Dapper para obtener una gran cantidad de datos para calcular algunas cosas. Este es mi método de extensión elegante para unirme a la tabla 3 en el archivo _RepositoryBase.cs.
public List> QueryMultiple(string sql, object param)
where T2 : class
where T3 : class
using (var con = new SqlConnection(GetConnStr()))
if (con.State == ConnectionState.Closed)
con.Open();
var query = con.Query>(sql, (t, t2, t3, t4) => Tuple.Create(t, t2, t3, t4), param);
//if (query.Count() == 0)
// return new List();
var data = query.ToList();
con.Close();
con.Dispose();
return data;
Entonces, esta función lo ayudará a obtener datos unidos a SQL a través de Dapper.
public List GetSqlJoinedDataViaDaper(int customerId)
var repo = new GenericRepository();
var sql = @"select table1.ID Table1ID, table1.*,
table2.ID Table2ID, table2.*,
table3.ID Table3ID, table3.*
from dbo.Table1 table1 (nolock)
left outer join dbo.Table2 table2 (nolock) on table2.ID=table1.FKTable2ID
left outer join dbo.Table3 table3 (nolock) on table3.ID=table1.FKTable3ID
where [email protected] ";
var resultWithJoin = repo.QueryMultiple(sql,
new p1 = 1, splitOn = "Table1ID,Table2ID,Table3ID" ).ToList();
var retval = new List();
foreach (var item in resultWithJoin)
Table1 t1 = item.Item2; //After first split
t1.Table2 = item.Item3; //After Table2ID split
t1.Table3 = item.Item4; //After Table3ID split
retval.Add(t1);
return retval;
Resumen: escriba su selección e inserte división entre tablas. Dígale divisiones a Dapper y obtenga sus datos. Usé esto y trabajé mejor que Entity Framework.
Si guardas alguna desconfianza y disposición de mejorar nuestro enunciado te proponemos escribir una explicación y con placer lo interpretaremos.