LINQ: Komplexe Verknüpfungen und Aggregationen beherrschen
In diesem Artikel wird gezeigt, wie Sie eine komplexe SQL- LEFT JOIN
und Aggregationsabfrage genau in LINQ übersetzen. Das Beispiel konzentriert sich auf ein Szenario, in dem eine genaue Zählung entscheidend ist und die Einbeziehung von Nullwerten in die Aggregation vermieden werden soll.
Hier ist die 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 SQL-Abfrage ruft effizient übergeordnete IDs ab und zählt die zugehörigen untergeordneten IDs. Eine direkte LINQ-Übersetzung muss LEFT JOIN
, Gruppierung und Aggregation korrekt verarbeiten.
Ein erster, möglicherweise fehlerhafter LINQ-Versuch könnte so aussehen:
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1 from j2 in j1.DefaultIfEmpty() group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count() }</code>
Das Problem bei diesem Code besteht darin, dass grouped.Count()
alle Elemente in der Gruppe zählt, einschließlich Nullwerte, die sich aus LEFT JOIN
ergeben. Dies führt zu ungenauen Zählungen.
Die Lösung liegt in der Verfeinerung der Aggregation:
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1 from j2 in j1.DefaultIfEmpty() group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>
Durch die Verwendung von grouped.Count(t => t.ChildId != null)
stellen wir sicher, dass nur Nicht-Null-ChildId
-Werte gezählt werden, was das Verhalten der SQL-Abfrage genau widerspiegelt. Diese überarbeitete LINQ-Abfrage liefert die richtigen Ergebnisse und vermeidet die Fallstricke beim Zählen von Nullen in der Aggregation.
Das obige ist der detaillierte Inhalt vonWie übersetze ich eine komplexe SQL-Left-Join- und Aggregationsabfrage genau in LINQ?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!