0

childTable に子がある場合とない場合がある親テーブル、parentTable があります。特定の親の子の平均完了率と、それらが存在する子の最大(期日) (日付) を取得しようとしています。私のSQLはこれです:

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

私の結果セットは、平均値と最大値の正しい値、または null の行を返します。この場合、フォローアップ処理を行う必要があるため、DataTable 行を介して foreach を実行している場合は null 値を無視できます。ただし、Linq でこれを実行しようとしていますが、Linq が null を double にキャストしようとしている System.InvalidOperationException を回避する方法がわかりません。これが私がこれまでに試したことです。

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));
    }

これが私の質問です。平均完了または最大期限 (日付) が null である返された行を処理するクエリを取得するにはどうすればよいですか?

4

4 に答える 4

0

値が null のレコードを (別の条件で) 除外するか、それらを含めたい場合は次のようにします。

a0 = g.Average(f0 => f0.complete.HasValue? f0.complete: 0 )
于 2013-04-02T15:36:06.193 に答える
0

次のように Average/Max を呼び出す前に、リストを nullable 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)
    };
于 2013-04-02T15:36:30.437 に答える
0

回答してくれたすべての人に感謝します。

私が持っていたように、基本的なクエリで null の匿名の問題を回避することはできませんでしたが、childTable に結合を追加すると、null がなくなりました。

別の解決策は、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()
     };
于 2013-04-03T11:52:17.107 に答える
0

complete が Nullable であると仮定すると、次のことができるはずです。

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) 
                       };
于 2013-04-02T15:38:31.623 に答える