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
Freigeben: 2025-01-25 04:43:09
Original
756 Leute haben es durchsucht

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:

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();
Nach dem Login kopieren

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

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();
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage