Heim >Datenbank >MySQL-Tutorial >Wie konvertieren Sie eine komplexe SQL -Abfrage mit mehreren Verknüpfungen, Zählungen und Links -Verbindungen in 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:
into
und DefaultIfEmpty()
, um einen LEFT JOIN zu simulieren. Distinct()
, um aggregierte Ergebnisse zu zählen. 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!