2013-06-28 123 views
0

使用LINQ to Entities我無法在給定父ID的列表的情況下計算子對象的數量。以下是我會做它直接的SQL:LINQ實體框架4 SELECT COUNT LEFT OUTER JOIN IN GROUP BY

SELECT COUNT(Child.ParentId) ,Parent.Parentd 
FROM Parent 
LEFT OUTER JOIN Child ON Child.ParentId = Parent.ParentId 
WHERE 
    Parent.ParentId IN (
     8417 
     ,118458 
     ,120567 
     ,121596 
     ) 
GROUP BY Parent.ParentId 

這是我在LINQ一直試圖實體:

var counts = from Parent in context.Parents 
    join Child in context.Children on Parent.ParentId equals Child.ParentId 
    into children 
    from jn in children.DefaultIfEmpty() 
    where iEnumerableParentIds.Contains(parent.parentId) 
    group parent by parent.parentId 
    into g 
    select new {count = g.Count(), parentId = g.Key}; 

這是相當接近,但我指望分組父,而不是當父母沒有孩子時,這個孩子給了我1的計數。

+0

你有一個「導航屬性」爲你的'父'實體,就像'兒童'屬性? – Jacob

+0

沒有。這個項目是一個「數據優先」的設置,並沒有一個正式的sql外鍵關係設置。我們從來沒有在db上設置外鍵,因爲我們知道有孤兒,我們無法從子表中刪除 –

+0

看起來像答案可能在這裏:http://stackoverflow.com/questions/695506/linq-left-join -group-by-and-count?rq = 1現在就試試吧...... –

回答

0

我認爲你必須改變group荷蘭國際集團源位置:

   group new { parent, jn } by parent.parentId 
      into g 
      select new {count = g.Select(x => x.jn).Count(), parentId = g.Key}; 
0

變種數從父=在context.Parents 在context.Children上Parent.ParentId加入兒童等於Child.ParentId 爲孩子 其中iEnumerableParentIds.Contains(parent.parentId) select new {count = children.Count(),parentId = Parent.ParentId};

沒有測試(從我的iPod響應;)),我很確定這會給你你想要的結果。我不記得自己做了什麼,但我認爲這應該起作用。基本上,您已經將連接分組,因此您不必再次對所有事件進行分組。