2016-04-30 39 views
0

加入我嘗試此查詢語法轉換:實體框架羣組加入不同的結果VS與

res = from co in db.SALES 
        join 
        op in db.OPERATORS 
        on co.ID_OP equals op.ID 
        where co.DATA_CLOSE == null 
        group new { co, op } by new { op.ID, op.NAME } into g 
        select new 
        { 
         ID = g.Key.ID, 
         NAME= g.Key.NAME, 
         COUNT = g.Select(x => x.co).Count() 

        }; 

到方法的語法:

res= db.OPERATORS.GroupJoin(
       db.SALES.Where(c=>c.DATA_CLOSE==null), 
       op => op.ID, 
       co => co.ID_OP, 
      (co, grp) => 
      new 
     { 
      NAME= co.NAME, 
      COUNT = grp.Select(x=>x.ID).Count() 
      }); 

第一查詢正常工作,就像內部聯接,我只有運營商打開銷售計數 第二給我所有經營者與開業銷售計數,如果沒有打開銷售,它給我0, 如何使第二個查詢工作像第一個

謝謝

+0

顯然'Join' ='GroupJoin' ='GroupBy'!。將工作查詢轉換爲不同的語法對我來說毫無意義。祝你好運。 –

+0

嗨,我想轉換一些sql連接方法的語法,這就是我想要使用的,我只能成功地將它們轉換爲查詢語法 – mrapi

回答

2

語法無關緊要 - 您可以使用任何一種語法來執行一個或另一個語法。

的差異從查詢的構建方式(在文章標題中提到)未來 - joinJoin)+ group byGroupBy)VS join intoGroupJoin)。

前者基本上等同於SQL的做法。而GroupJoin是一個LINQ特定的構造。重要的是要注意它有左外部連接語義(實際上它用於模擬LINQ中的左外部連接)。在很多方面,它比SQL方式更好,因爲它避免了結果的冗餘分組。從另一方面來說,由於左外部聯接語義,它總是返回外部記錄。如果你想過濾掉沒有匹配的內部記錄的外部記錄,你必須自己做。舉例來說,加入你的第二個查詢

.Where(x => x.Count != 0) 

或一般的末尾,使用以下模式:

from a in A 
join b in B on a.Key equals b.Key into g 
where g.Any() 
...