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?

Comment traduire une requête SQL complexe avec plusieurs jointures, compter et une jointure à gauche dans son équivalent LINQ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-25 04:21:08675parcourir

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

Convertir SQL contenant plusieurs connexions, compter et la connexion gauche en 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:

Compréhension de la requête LINQ:

<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.
  • Les classes de connexion sont représentées par des attributs de navigation ou des objets anonymes.
  • La connexion gauche doit être utilisée avec GroupJoin ... SelectMany. Faites attention à la situation où
  • peut être vide, et le chèque de vacance correspondant est ajouté à
  • et
  • .
  • Cette réponse révisée améliore la requête LINQ en manipulant la valeur nul potentielle de 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn