Maison >développement back-end >C++ >Comment compter avec précision les enregistrements enfants dans une jointure gauche LINQ et un groupe par ?
LINQ – Conseils pour les jointures à gauche, le regroupement et le comptage précis
La conversion de requêtes SQL complexes en LINQ to SQL peut parfois s'avérer délicate. Un exemple typique consiste à effectuer une jointure à gauche, à regrouper par colonne et à compter le nombre d'enregistrements qui remplissent une certaine condition.
Considérez la requête SQL suivante :
<code class="language-sql">SELECT p.ParentId, COUNT(c.ChildId) FROM ParentTable p LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId GROUP BY p.ParentId</code>
Cette requête récupère le ParentId et le nombre ChildId correspondant à partir de deux tables, ParentTable et ChildTable.
Pour convertir ceci en LINQ to SQL, effectuez d'abord une jointure à gauche :
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1</code>
Cependant, la partie COUNT(c.ChildId)
doit être manipulée avec précaution. Sans considérations particulières, le SQL généré par LINQ renverra toujours COUNT(*)
, ce qui risque de ne pas fournir les résultats attendus.
Pour compter avec précision uniquement les valeurs ChildId correspondantes, ajoutez ce qui suit après la clause into
:
<code class="language-csharp">from j2 in j1.DefaultIfEmpty()</code>
Cela garantit que si aucun enregistrement enfant correspondant n'est trouvé, une valeur nulle est attribuée à j2.
Enfin, effectuez le regroupement et le comptage :
<code class="language-csharp">group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>
Ce code regroupe par ParentId et ne compte que les enregistrements dont ChildId n'est pas vide. Le résultat est un objet avec les propriétés ParentId et Count, correspondant au format de la requête SQL d'origine. Cela garantit que nous ne comptons que les cas où des sous-enregistrements existent, en évitant les valeurs nulles causées par les jointures gauches qui affectent la précision des résultats du comptage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!