2009-07-14 7 views
34

Je me suis toujours demandé pourquoi il y a un mot-clé equals dans les jointures linq plutôt que d'utiliser l'opérateur ==.Linq: Quelle est la différence entre == et égal à une jointure?

Property deadline = 
(from p in properties 
join w in widgets 
    on p.WidgetID equals w.ID 
select p).First(); 

Au lieu de

Property deadline = 
(from p in properties 
join w in widgets 
    on p.WidgetID == w.ID 
select p).First(); 

[EDIT] reformulé la question et a révisé les exemples.

Répondre

38

Il y a une bonne explication par Matt Warren à The Moth:

« La raison pour laquelle C# a le mot « égaux » au lieu de l'opérateur « == » était de préciser que les « sur les » besoins de la clause Vous devez fournir deux expressions séparées qui sont comparées pour l'égalité et non une seule expression de prédicat Le modèle from-join correspond à l'opérateur de requête standard Enumerable.Join() qui spécifie deux délégués distincts utilisés pour calculer des valeurs qui peuvent ensuite être comparées. Il a besoin d'eux en tant que délégués séparés afin de construire une table de recherche avec un et sonder dans la table de recherche avec l'autre.Un processeur de requête complet comme SQL est libre d'examiner une seule expression de prédicat et de choisir comment il va le traiter. Cependant, pour faire LINQ fonctionner similaire à SQL, il faudrait que la condition de jointure toujours être spécifié comme un arbre d'expression, une surcharge importante pour l'objet simple en mémoire le cas. »

Cependant, cela concerne join. I » ne suis pas sûr equals doit être utilisé dans votre exemple de code (-t-il même compiler?).

+1

Vous avez raison, il ne compile même pas, mon mal! Cela fait un certain temps que j'ai eu le problème avec == et égal, mais je suppose que c'était avec une jointure à l'époque quand j'ai accidentellement utilisé ==. Merci pour l'explication, de toute façon! –

15

votre première version ne compile pas. Vous que utilisation equals dans les jointures, pour rendre les moitiés séparées du équijointure clair le compilateur

+0

Oui ... Le premier est bon. –

+0

Ouais, désolé, mon mauvais. Cela fait un certain temps que j'ai eu le problème (qui était bien sûr avec une jointure), où j'ai accidentellement mis == au lieu d'égales et je me demandais pourquoi il y a un mot-clé égal en premier lieu. Je m'en suis souvenu car je n'y ai pas trouvé de réponse;) –

+0

Donc, dans le cas de jointure, est-il légitime d'utiliser == ou devriez-vous toujours utiliser des égales? –

Questions connexes