Heim >Datenbank >MySQL-Tutorial >Wie konvertieren Sie eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählungen und Links -Verbindungen in Linq?

Wie konvertieren Sie eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählungen und Links -Verbindungen in Linq?

Barbara Streisand
Barbara StreisandOriginal
2025-01-25 04:43:09729Durchsuche

How to Convert a Complex SQL Query with Multiple Joins, Counts, and Left Joins into LINQ?

Konvertieren Sie komplexe SQL-Abfragen mit mehreren Joins, Counts und Left-Joins in LINQ

Dieses Beispiel zeigt, wie eine komplexe SQL-Abfrage mit mehreren Joins und Aggregationen in eine entsprechende LINQ-Abfrage konvertiert wird. Diese Abfrage ruft Daten aus drei Tabellen (TABLE_C, TABLE_V und TABLE_R) ab und führt eine eindeutige Zähloperation für bestimmte Spalten durch.

SQL in LINQ-Abfrageverständnis konvertieren:

  1. Unterabfragen gruppieren: Unterabfragen in individuell deklarierte Variablen umwandeln. In diesem Beispiel wird TABLE_R mithilfe der anonymen Typen Id und Count gruppiert.
  2. Join-Klausel: Verwenden Sie Navigationseigenschaften oder anonyme Objekte zum Verbinden und verwenden Sie into und DefaultIfEmpty(), um einen LEFT JOIN zu simulieren.
  3. GroupBy: Gruppiert Ergebnisse über mehrere Spalten hinweg mithilfe eines anonymen Typs. Verwenden Sie Distinct(), um aggregierte Ergebnisse zu zählen.
  4. Auswählen: Wählen Sie die erforderlichen Spalten aus, indem Sie einen anonymen Typ mit den angegebenen Feldern erstellen.

Das Folgende ist LINQ-Code, der in der Abfrageausdruckssyntax geschrieben ist:

<code class="language-csharp">var subrq = from r in Table_R
            group r by r.Id into rg
            select new { Id = rg.Key, cnt = rg.Count() };

var ansq = (from c in Table_C
            join v in Table_V on c.Id equals v.Id
            join r in subrq on c.Id equals r.Id into rj
            from r in rj.DefaultIfEmpty()
            where c.IdUser == "1234"
            group new { c, v, r } by new { c.Id, c.Title, r.cnt } into cvrg
            select new {
                cvrg.Key.Title,
                Nb_V2 = cvrg.Count(),
                Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(),
                Nb_R = (int?)cvrg.Key.cnt
            }).Distinct();</code>

Das Folgende ist der entsprechende LINQ-Code, der in der Lambda-Ausdruckssyntax geschrieben wurde:

<code class="language-csharp">var subr2 = Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() });
var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(subr2, 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可能为null的情况
                  .Select(cvrg => new { 
                      cvrg.Key.Title, 
                      Nb_V2 = cvrg.Count(), 
                      Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), 
                      Nb_R = (int?)cvrg.Key.cnt 
                  }).Distinct();</code>

Achten Sie auf die Verarbeitung von cvr.r.cnt in der Lambda-Ausdrucksversion. Der Null-Bedingungsoperator ?. wird hinzugefügt, um die Situation zu behandeln, in der r null sein kann, und NullReferenceException-Ausnahmen zu vermeiden. Beide Methoden erfüllen die gleiche Funktionalität und welche Methode Sie wählen, hängt von Ihren persönlichen Vorlieben ab.

Das obige ist der detaillierte Inhalt vonWie konvertieren Sie eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählungen und Links -Verbindungen in Linq?. 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