Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählen und einer linken Verbindung in das linq -Äquivalent übersetzen?

Wie kann ich eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählen und einer linken Verbindung in das linq -Äquivalent übersetzen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-25 04:21:08676Durchsuche

How to translate a complex SQL query with multiple joins, COUNT, and a left join into its LINQ equivalent?

Konvertieren Sie SQL, das mehrere Joins, COUNTs und Left-Joins enthält, in LINQ

Die angegebene SQL-Abfrage enthält mehrere Joins (einschließlich Links-Joins) und Aggregationen unter Verwendung der Funktionen COUNT und COUNT(DISTINCT). Das Ziel besteht darin, diese Abfrage in ihr LINQ-Äquivalent zu konvertieren, um sie in der Datenzugriffsschicht der Anwendung zu verwenden.

SQL-Abfrage:

<code class="language-sql">SELECT DISTINCT c.Id, 
       c.Title, 
       COUNT(v.Id) AS 'Nb_V2',
       COUNT(DISTINCT v.IdUser) AS 'Nb_V1',
       r.cnt AS 'Nb_R'
FROM TABLE_C c
JOIN TABLE_V v on c.Id = v.Id
LEFT JOIN ( 
    SELECT Id, COUNT(*)  AS cnt 
    FROM TABLE_R 
    GROUP BY Id
) r ON c.Id = r.Id
WHERE c.IdUser = '1234'
GROUP BY c.Id, c.Title, r.cnt</code>

LINQ-Abfrageverständnis:

Eine Möglichkeit, SQL-Abfragen in LINQ-Abfrageverständnisse umzuwandeln, ist die Verwendung verschachtelter Joins und anonymer Typgruppierung. Allerdings kann die Konvertierung der Funktionen COUNT und COUNT(DISTINCT) in die LINQ-Syntax eine Herausforderung sein.

Lambda-Ausdruck:

Eine sauberere Lösung für LINQ-Transformationen kann mithilfe von Lambda-Ausdrücken implementiert werden. Durch die Nutzung der Operation „join...selectMany“ und der Gruppierung kann die Abfrage wie folgt geschrieben werden:

<code class="language-csharp">var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() }), cv => cv.c.Id, r => r.Id, (cv, rj) => new { cv.c, cv.v, rj })
                  .SelectMany(cvrj => cvrj.rj.DefaultIfEmpty(), (cvrj, r) => new { cvrj.c, cvrj.v, r })
                  .GroupBy(cvr => new { cvr.c.Id, cvr.c.Title, cvr.r?.cnt }) //处理r可能为空的情况
                  .Select(cvrg => new { 
                      cvrg.Key.Title, 
                      Nb_V2 = cvrg.Count(), 
                      Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), 
                      Nb_R = cvrg.Key.cnt 
                  });</code>

Übersetzungsleitfaden:

Um SQL-Abfragen effizient in LINQ zu konvertieren, können die folgenden Richtlinien angewendet werden:

  • Unterauswahlen sollten unabhängig transformiert werden, es sei denn, sie verweisen auf eine externe Spalte.
  • Einzelne Monadenoperatoren und Aggregatoperatoren können direkt auf die Ergebnisse von LINQ-Abfragen angewendet werden.
  • Anonyme Typen werden zur Darstellung mehrerer Spalten verwendet.
  • Join-Klauseln werden durch Navigationseigenschaften oder anonyme Objekte dargestellt.
  • Linker Beitritt erfordert GroupJoin...SelectMany. Achten Sie darauf, den Fall zu behandeln, in dem r leer sein kann, und fügen Sie entsprechende Nullwertprüfungen in GroupBy und Select hinzu.

Diese überarbeitete Antwort verbessert die LINQ-Abfrage, indem sie den potenziellen Nullwert von r.cnt in den Klauseln GroupBy und Select behandelt, wodurch sie robuster wird. Der Rest der Erklärung bleibt gleich , Bereitstellung einer klaren und genauen Übersetzungsanleitung von SQL nach LINQ.

Das obige ist der detaillierte Inhalt vonWie kann ich eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählen und einer linken Verbindung in das linq -Äquivalent übersetzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn