1

これは、匿名型をに宣言する私のコードですselect:

var projectsByManagersAndMonths = projectDates
    .Where(pd => pd.project.isEnabled)
    .GroupBy(pd => new { pd.project.manager, pd.project.dtEnd.Value.Month })
    .Select(group => new
        {
            Manager = group.Key.manager.displayName,
            Month = group.Key.Month,
            Projects = group.Select(pd => new 
                { 
                    Count = group.Count(),
                    CostToComplete = group.Sum(pdd => pdd.totals.costToComplete),
                    TimeWorkable = new UserBillingRate(WS, group.Key.manager, new Period(start, end)).TimeWorkable,
                    StatusOfCharge = CostToComplete / TimeWorkable //IMPOSSIBLE
                })
        })
    .ToList();

を追加した行を見ると、//IMPOSSIBLE上記で計算した 2 つのデータを同じ匿名型に再利用しようとしています。

どうすればこれを達成できますか?

4

2 に答える 2

3

値を参照できる中間オブジェクトを作成する必要があります。

var projectsByManagersAndMonths = projectDates
    .Where(pd => pd.project.isEnabled)
    .GroupBy(pd => new { pd.project.manager, pd.project.dtEnd.Value.Month })
    .Select(group => new
        {
            Manager = group.Key.manager.displayName,
            Month = group.Key.Month,
            Projects = group.Select(pd => new 
                { 
                    Count = group.Count(),
                    CostToComplete = group.Sum(pdd => pdd.totals.costToComplete),
                    TimeWorkable = new UserBillingRate(WS, group.Key.manager, new Period(start, end)).TimeWorkable,
                }).Select(pd => new 
                { 
                    Count = pd.Count,
                    CostToComplete = pd.CostToComplete,
                    TimeWorkable = pd.TimeWorkable,
                    StatusOfCharge = pd.CostToComplete / pd.TimeWorkable //POSSIBLE
                })
        })
    .ToList();
于 2013-09-16T15:14:18.943 に答える
2

次の 2 番目のレベルを追加することで実行できますSelect

Projects = group.Select(pd => new 
            { // This level deals with the first level of computation
                Count = group.Count(),
                CostToComplete = group.Sum(pdd => pdd.totals.costToComplete),
                TimeWorkable = new UserBillingRate(WS, group.Key.manager, new Period(start, end)).TimeWorkable
              // This level takes the computed results, and add derived computations
            }).Select(pd => new {
                pd.Count,
                pd.CostToComplete,
                pd.TimeWorkable,
              // Now that pd is an anonymous class created by the level above,
              // both pd.CostToComplete and pd.TimeWorkable are defined.
                StatusOfCharge = pd.CostToComplete / pd.TimeWorkable
            })
于 2013-09-16T15:14:53.593 に答える