2009-12-13 30 views
0

當我聲明接合在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)什麼是實際上得到選入克?很難理解into關鍵字。如果你舉例說明關鍵字"into",我會很高興。

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 
    } 

在第2行,我們使用「B」在第3行也我們使用相同的b選擇項 ,莫非我們覆蓋我們在選定 數據線2'

回答

1

1)你正在做的一個group joing將是在a每個元素IGroupingg.Key將從a的元件,和g(實現IEnumerable)將共同找到來自b的所有匹配元素。要充分理解這一點,請在LINQPad中試用。另外,請閱讀documentation

2)into關鍵字將第一個b合併到b_join中,如上所述,這將是IGrouping。之後,第一個b不在範圍之內。

0

如果您在編譯代碼使用.NET反射,你可以看到你的第一個查詢等效於以下內容:

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

請注意,您正在執行組加入,但只返回組。將其與普通連接進行比較:

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

如果存在任何此類元素,則返回b中與每個元素匹配的元素。