あなたはこれを行うことができます:
// run the filters once and get List<DataRow> with the matching rows
var list = (from m in month
where <some long expression>
select m).ToList();
// build the summary object
var result = new {
BGCO_MINUTES = list.Sum(m => m["BGCO_MINUTES"] as Decimal?),
_800IB_MINUTES= list.Sum(m => m["800IB_MINUTES"] as Decimal?),
}
そして、それはあなたのwhere句がタイプするのに長いだけでなく、評価するのに計算コストがかかると仮定しています。これにより、列ごとに1回リストが繰り返されます。
リストを本当に1回だけ繰り返したい場合は、おそらくEnumerable.Aggregateを使用して行うことができますが、コードはそれほどエレガントではありません(私の意見では)。
// run the filters once and get List<DataRow> with the matching rows
var a = (from m in month
where <some long expression>
select m)
.Aggregate( new { BGCO_MINUTES = (decimal?)0m,
_800IB_MINUTES = (decimal?)0m },
(ac,v) => new { BGCO_MINUTES = ac.BGCO_MINUTES + (decimal?)v["BGCO_MINUTES"],
_800IB_MINUTES = ac._800IB_MINUTES + (decimal?)v["800IB_MINUTES"] });
私が言ったように、それは最初のバージョンよりもエレガントではないと思いますが、それはうまくいくはずです。最初のものはwhere句(メモリコスト)に一致する値の一時的なコピーを必要とし、1は各フィールド(CPUコスト)のリストを通過しますが、後者のバージョンよりもはるかに読みやすいと思います-必ず理解しにくいバージョンを使用する前に、パフォーマンスの違いはそれだけの価値があります。