LINQ – Tipps für Linksverknüpfungen, Gruppierung und präzises Zählen
Das Konvertieren komplexer SQL-Abfragen in LINQ to SQL kann manchmal schwierig sein. Ein typisches Beispiel besteht darin, einen Left-Join durchzuführen, nach Spalte zu gruppieren und die Anzahl der Datensätze zu zählen, die eine bestimmte Bedingung erfüllen.
Betrachten Sie die folgende SQL-Abfrage:
<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>
Diese Abfrage ruft die ParentId und die entsprechende ChildId-Anzahl aus zwei Tabellen ab, ParentTable und ChildTable.
Um dies in LINQ to SQL zu konvertieren, führen Sie zunächst einen linken Join aus:
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1</code>
Allerdings muss mit dem COUNT(c.ChildId)
Teil vorsichtig umgegangen werden. Ohne besondere Überlegungen gibt LINQ-generiertes SQL immer COUNT(*)
zurück, was möglicherweise nicht die erwarteten Ergebnisse liefert.
Um nur übereinstimmende ChildId-Werte genau zu zählen, fügen Sie nach der into
-Klausel Folgendes hinzu:
<code class="language-csharp">from j2 in j1.DefaultIfEmpty()</code>
Dadurch wird sichergestellt, dass j2 ein Nullwert zugewiesen wird, wenn kein passender untergeordneter Datensatz gefunden wird.
Führen Sie abschließend die Gruppierung und Zählung durch:
<code class="language-csharp">group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>
Dieser Code gruppiert nach ParentId und zählt nur Datensätze, deren ChildId nicht leer ist. Das Ergebnis ist ein Objekt mit den Eigenschaften ParentId und Count, das dem Format der ursprünglichen SQL-Abfrage entspricht. Dies stellt sicher, dass wir nur die Fälle zählen, in denen Unterdatensätze vorhanden sind, und vermeidet Nullwerte, die durch Linksverknüpfungen verursacht werden und die Genauigkeit der Zählergebnisse beeinträchtigen.
Das obige ist der detaillierte Inhalt vonWie kann man untergeordnete Datensätze in einem LINQ Left Join und Group By genau zählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!