3

私はEmployeesテーブルを持っています:

EmployeeID  |  EmployeeName
---------------------------
1           |  Jack
2           |  Jill
3           |  Roger

そして、オカレンス テーブル:

OccurrenceID  |  EmployeeID  |  Points
--------------------------------------
1             |  1           |  5
2             |  2           |  3
3             |  1           |  1

2 つのテーブルをグループ化して合計する LINQ クエリが動作しています。

groupedOccurrences = (from o in db.Occurrences.Include(o => o.Employee)
                      where o.OccurrenceDate >= beginDate
                         && o.OccurrenceDate <= endDate
                      group o by o.Employee.EmployeeName into g
                      select new OccurrenceByQuarter
                      {
                          Name = g.Key,
                          Total = g.Sum(o => o.Points)
                       });

次の出力が生成されます。

 Jack 6
 Jill 3

しかし、従業員のロジャーも出力に 0 ポイントで表示されるようにしたいと考えています。次のようにLINQクエリに結合を追加しようとしました:

groupedOccurrences = (from e in db.Employees
                      from o in db.Occurrences
                      join o in db.Occurrences on e.EmployeeID equals o.EmployeeID into j1
                      from j2 in j1.DefaultIfEmpty()
                      group j2 by e.EmployeeName into g
                      select new OccurrenceByQuarter
                      {
                          Name = g.Key,
                          Total = g.Sum(o => o.Points)
                      });

しかし、ポイントの数が大幅に膨らんでしまいます (本来の 24 倍のように)。

public int? Total { get; set; }また、OccurrencesByQuarter クラスで Total の宣言を に変更して、null の場合に Total が 0 を返すようにしようとしましたが、LINQ クエリを変更して含めるようにしようとするTotal = g.Sum(o => o.Points) ?? 0と、「演算子 ?? を適用できません」というエラーが表示されます。 int 型および int 型のオペランドに".

どんな助けでも大歓迎です。

4

1 に答える 1

7

グループ結合を使用:

groupedOccurrences = (from e in db.Employees
                      join o in db.Occurrences.Where(x => 
                                  x.OccurrenceDate >= beginDate &&
                                  x.OccurrenceDate <= endDate)
                           on e.EmployeeID equals o.EmployeeID into g
                      select new OccurrenceByQuarter
                      {
                          Name = e.EmployeeName,
                          Total = g.Sum(x => (int?)x.Points) ?? 0
                      });

結果は次のようになります。

Jack  6
Jill  3
Roger 0

空のグループに戻る0には、要約されたプロパティを nullable にキャストし、null 合体演算子を適用してデフォルト値を返します。g.Sum(x => (int?)x.Points) ?? 0

于 2012-12-07T17:25:19.657 に答える