2013-04-02 98 views
0

我有一個父表parentTable,它可能有或沒有孩子在childTable中。我期望得到任何給定的父母子女的平均百分比,以及他們存在的孩子的MAX(到期日期)(日期)。我的SQL是這樣的:Linq查詢有兩個子查詢組合,一個平均,一個最大

SELECT parentRecord_id, assigned_to, 
    (SELECT avg(complete) 
    FROM childTable 
    WHERE parent_id = parentRecord_id 
    and deleted IS NULL 
    GROUP BY parent_id), 
    (SELECT max(due) 
    FROM childTable 
    WHERE parent_id = parentRecord_id 
    and deleted IS NULL 
    GROUP BY parent_id 
    ) 
FROM parentTable s 
WHERE s.deleted IS NULL and assigned_to IS NOT NULL 

我的結果集爲我提供了正確的平均值和最大值或爲空的行。在這種情況下,我必須做跟進處理,以便我可以忽略空值,如果我通過DataTable行進行foreach。然而,我試圖在Linq中這樣做,並不知道如何避免一個System.InvalidOperationException其中Linq試圖將null轉換爲double。這是我到目前爲止所嘗試的。

var query8 = from s in db.parentTable 
    where s.deleted == null 
    select new 
     { 
      ID = s.assigned_to, 
      Average = 
       ((from t in db.childTable 
         where t.parent_id == s.strategy_id 
         group t by new { t.parent_id } into g 
         select new 
          { 
          a0 = g.Average(f0 => f0.complete) 
          }).FirstOrDefault().a0) 
         }; 
foreach (var itm in query8) 
    { 
     Console.WriteLine(String.Format("User id:{0}, Average: {1}", itm.ID, itm.Average)); 
    } 

這是我的問題。如何獲得查詢以處理那些平均完成或最大到期日(date)爲空的返回行?

+0

如果存在空值,它會做什麼正確的事情?例如,如果有值'{1,2,null}',那麼平均值是1.5還是1?或者其他值? – StriplingWarrior

回答

0

您可以過濾掉其中的值都爲空的記錄(由其他條件),或者如果你要包括他們做這樣的事情:

a0 = g.Average(f0 => f0.complete.HasValue? f0.complete: 0) 
0

我會投的列表空Double致電前平均/最大像這樣:

var query8 = 
    from s in db.parentTable   
    where s.deleted == null 
    select new 
    { 
     ID = s.assigned_to, 
     Average = 
     from t in db.childTable 
     where t.parent_id == s.strategy_id 
     group t by t.parent_id into g 
     select g.Cast<double?>().Average(f0 => f0.complete) 
    }; 
0

假設完全是空的,你應該能夠做到:

var query8 = from s in db.parentTable 
    where s.deleted == null 
    select new 
     { 
      ID = s.assigned_to, 
      Average = 
       ((from t in db.childTable 
         where t.parent_id == s.strategy_id 
         && s.complete.HasValue() 
         group t by new { t.parent_id } into g 
         select new 
          { 
          a0 = g.Average(f0 => f0.complete) 
          }).FirstOrDefault().a0) 
         }; 
0

感謝所有回覆。

我無法繞過基本查詢的空匿名問題,因爲我擁有它,但向childTable添加聯接消除了空值。

另一種解決方案是在g.DefaultIfEmpty子句中使用from x。

var query8 = 
    from st in db.tableParent 
    select new { Ass = st.assigned_to , 
     Avg = 
     (from ta in db.tableChild 
     group ta by ta.parent_id into g 
     from x in g.DefaultIfEmpty() 
     select g.Average((f0=>f0.complete))).FirstOrDefault() 
    };