2009-12-13 5 views
0

Quand je déclarejoindre à Linq

int[] a = { 1, 2 ,10,30}; 

int[] b = { 10, 20, 30 }; 

    var q = from item1 in a 
        join item2 in b 
        on item1 equals item2 
        into g 
        select g 

1) Quel est réellement obtenir sélectionné en g? Il est difficile de comprendre le mot-clé into. Si vous donnez un exemple pour expliquer le mot-clé "into", je serai heureux.

2)

How do the following code actually projected ? 

1 from a in db.coll1 
2 join b in db.coll2 on a.PK equals b.PK into b_join 
3 from b in b_join.DefaultIfEmpty() 
4 where 
5  b.PK == null 
6 select new { 
7  a.PK, 
8  a.Value, 
9  Column1 = (System.Int32?)b.PK, 
10  Column2 = b.Value 
    } 

dans la ligne 2, nous utilisons « b » pour sélectionner l'élément dans la ligne 3 aussi nous utilisons le même b, cela signifie que nous prépondérants les données, nous avons sélectionné à ligne 2?

Répondre

1

1) Vous faites un group join. g sera un IGrouping pour chaque élément a. g.Key sera l'élément de a et g (qui met en œuvre IEnumerable) co N'obtenez pas tous les éléments correspondants de b. Pour le comprendre pleinement, essayez le LINQPad. Lisez également le documentation.

2) Le mot-clé into fusionne le premier b en b_join, qui sera un IGrouping que je décrit ci-dessus. Après cela, le premier b n'est plus dans la portée.

0

Si vous utilisez NET Reflector sur votre code compilé, vous pouvez voir que votre première requête est équivalente à ce qui suit:

IEnumerable<IEnumerable<int>> q = a.GroupJoin(b, 
    item1 => item1, 
    item2 => item2, 
    (item1, group) => group); 

Notez que vous effectuez un groupe rejoindre, mais seulement le retour des groupes. Comparez ceci avec une jointure ordinaire:

IEnumerable<int> q = a.Join(b, 
    item1 => item1, 
    item2 => item2, 
    (item1, item2) => item2); 

Ceci retourne les éléments de b qui correspondent à chaque a, s'il existe un tel élément.

Questions connexes