Linq – Grouper par plusieurs tables

À l’aide de Linq to Sql, comment regrouper les 2 tableaux suivants.

Tableau des commandes :

CustomerID | Name |Date 1 | order1 | 2010-01-01 2 | order2 | 2010-01-01 2 | order3 | 2010-04-01 

Tableau d’appels :

 CustomerID | Name |Date 1 | call1 | 2010-01-01 3 | call2 | 2010-06-01 2 | call3 | 2010-05-01 

Je souhaite regrouper les deux tables par date, Résultat :

 Date | Orders | Calls 2010-01-01 | 2 | 1 2010-04-01 | 1 | 0 2010-05-01 | 0 | 1 2010-06-01 | 0 | 1 

je sais comment regrouper une seule table,

 from o in Orders group o by o.Date.Date into og select new {Date = og.Key,Orders= og.Count()}; 

Comment puis-je grouper les deux? THX!

Étant donné que les deux tables semblent avoir une structure similaire, je vous conseillerais de projeter les deux sous une forme équivalente, puis de les regrouper sur la concaténation de ces deux ensembles.

 var orders = from o in Orders select new { IsOrder = true, o.Date }; var calls = from c in Calls select new { IsOrder = false, c.Date }; var result = from x in orders.Concat(calls) group x by x.Date into og select new {Date = og.Key, Orders= og.Count(o=>o.IsOrder), Calls = og.Count(c=>!c.IsTrue)}; 

En raison de la nature paresseuse de Linq2Sql, ceci pourrait en fait être réduit à une seule requête. Dans l’intérêt de la performance, je voudrais m’assurer que ce n’est pas une requête de l’enfer.

Vous pouvez utiliser la méthode Union:

  var result = (from c in Calls group c by c.Date into cg select new {Date = cg.Key, Calls = cg.Count(), Orders = 0}) .Union(from o in Orders group o by o.Date into og select new {Date = og.Key, Calls = 0, Orders = og.Count()}) .GroupBy(x => x.Date) .Select(g => new {Date = g.Key, Calls = g.Max(r => r.Calls), Orders = g.Max(r => r.Orders)}); foreach (var row in result) { Trace.WriteLine(row); } 

Ceci est très similaire au SQL que vous écririez (une union des deux tables, puis une requête externe pour fusionner les résultats dans une ligne)