2014-11-10 20 views
8

Ho letto Programmazione Microsoft LINQ in Microsoft .NET Framework 4 e ora sto capendo la clausola join in LINQ, ma ho un dubbio o una questione di rispetto per la sua definizione; nel libro è definisce:Differenza tra operatori uguali (LINQ) e == (C#)?

È possibile definire confronti di uguaglianza solo utilizzando una speciale equals parola che si comporta diversamente dall'operatore ==, poiché la posizione degli operandi è significativo. Con equals, la chiave di sinistra consuma la sequenza sorgente esterna e il tasto destro consuma la sequenza sorgente interna. La sequenza dell'origine esterna è compresa solo nella parte sinistra di equals e la sequenza sorgente interna è compresa solo nella parte destra.

E c'è anche una definizione formale su questo operatore:

join-clause ::= join innerItem in innerSequence on outerKey equals innerKey

Ti prego, qualcuno mi può spiegare il concetto di cui sopra, in altre parole o parafrasando esso?

+3

L'outersource di un join si unisce alla innerkey uguale a innerkey'. In sostanza, quello che stanno dicendo è che non è possibile scrivere quanto segue: 'outersource join unit interna su innerkey uguale a outerkey' – Rob

+0

Quindi ora quali sono le differenze semantiche tra i due in un contesto' IEnumerable'. Sono sicuro che questo potrebbe aiutare con 'IQueryable'. – leppie

risposta

10

Suppongo che sia perché "uguale" nel join non funziona come ==, quindi i progettisti linguistici hanno deciso di non chiamare ciò che sta facendo la stessa cosa.

In C#, è un po 'dato che a == b è esattamente lo stesso di b == a. Nella definizione di un join, non è così:

var list = from a in ctx.TableA 
      join b from ctx.TableB on a.Id equals b.tableAId 

Questo, sopra, è valido.

var list = from a in ctx.TableA 
      join b from ctx.TableB on b.tableAId equals a.Id 

Questo non verrà compilato. Quello che la specifica del linguaggio dice è che la tabella 'outer' (TableA in questo caso) deve essere specificata per prima e quella interna (TableB) deve essere seconda. Suppongo che i progettisti linguistici pensassero che questo fosse sufficientemente diverso dal modo in cui funziona == che sarebbe una cattiva idea usarlo e hanno avuto l'idea di usare "uguali".

Penso che probabilmente ho ragione, ma solo i progettisti linguistici coinvolti sapranno davvero la verità.

Problemi correlati