Maison >base de données >tutoriel mysql >Comment effectuer une jointure externe gauche avec plusieurs conditions dans LINQ to SQL ?

Comment effectuer une jointure externe gauche avec plusieurs conditions dans LINQ to SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-12 09:58:41425parcourir

How to Perform a Left Outer Join with Multiple Conditions in LINQ to SQL?

LINQ to SQL : maîtriser les jointures externes gauches avec plusieurs critères

La traduction de requêtes SQL en LINQ to SQL peut être délicate, en particulier avec des jointures complexes. Cet article se concentre sur un scénario courant : effectuer une jointure externe gauche avec plusieurs conditions.

Le défi SQL :

Notre point de départ est une requête SQL utilisant une jointure externe gauche entre les tables « période » et « faits ». La jointure utilise deux conditions : 'p.id = f.periodid' et 'f.otherid = 17'. La deuxième condition fait office de filtre.

L'obstacle LINQ :

La méthode

LINQ DefaultIfEmpty() est l'approche habituelle pour les jointures externes gauches. Cependant, ajouter simplement 'f.otherid = 17' à une clause where après la jointure ne fonctionne pas comme prévu.

Solutions LINQ efficaces :

La clé est d'appliquer la deuxième condition de jointure avant d'utiliser DefaultIfEmpty(). Voici deux méthodes efficaces :

Méthode 1 : Utilisation de la syntaxe de la méthode d'extension :

<code class="language-csharp">from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.Where(f => f.otherid == 17).DefaultIfEmpty()
where p.companyid == 100
select fgi.value</code>

Méthode 2 : Utilisation d'une sous-requête :

<code class="language-csharp">from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in (from f in fg
             where f.otherid == 17
             select f).DefaultIfEmpty()
where p.companyid == 100
select fgi.value</code>

Pourquoi cela fonctionne :

La différence cruciale réside dans le placement de la condition. Mettre 'f.otherid == 17' dans la clause where après DefaultIfEmpty() filtrerait les lignes où 'f' est nul (car la jointure n'a pas trouvé de correspondance). En le plaçant dans la clause Where() avant DefaultIfEmpty(), nous filtrons avant les valeurs nulles sont introduites, garantissant ainsi le comportement correct de la jointure externe gauche. Notez que nous sélectionnons fgi.value plutôt que f.value pour gérer correctement les valeurs nulles dans la première méthode.

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