Maison >base de données >tutoriel mysql >Comment traduire une requête SQL complexe avec plusieurs jointures, compter et une jointure à gauche dans son équivalent LINQ?
La requête SQL donnée contient plusieurs connexions (y compris les connexions de gauche) et l'agrégation de l'utilisation de la fonction Count et Count (distincte). L'objectif est de convertir cette requête en ses éléments équivalents LINQ pour la couche d'accès aux données de l'application.
requête SQL:
<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>
Une méthode qui convertit la requête SQL en compréhension de la requête LINQ consiste à utiliser des connexions imbriquées et des types anonymes. Cependant, la conversion du nombre de comptes et de dénombrement (différente) en syntaxe LINQ peut être difficile. Expression de lambda:
Vous pouvez utiliser les expressions Lambda pour implémenter une solution plus concise pour la conversion LINQ. En utilisant Join ... Selectmany pour fonctionner et en groupe, vous pouvez écrire la requête comme suit:
Guide de traduction:
Afin de convertir efficacement la requête SQL en LINQ, les directives suivantes peuvent être appliquées:
<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>
à moins que l'enfant ne choisit de citer la colonne externe, elle doit être convertie indépendamment.
Un seul opérateur unique et opérateur de polymérisation peut être directement appliqué aux résultats de la requête LINQ.Le type anonyme est utilisé pour représenter plusieurs colonnes.
r
dans les clauses GroupBy
et Select
, ce changement. Guide de SQL à Linq.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!