静的な数のフィールドがあるため、これをお勧めします。
var DesiredSym =
(from r in Symptoms
where r.Status.Equals(1) && r.Create_Date < TimespanSecs
select retireMe)
.Take(5);
var sum = DesiredSym.Sum(s => s.Month1_Use + s.Month2_Use + ... + s.Month12_Use);
リフレクションを使用することもできますが、最初に結果セット全体をメモリにプルする必要があるため、大幅に遅くなり、より多くのリソースが必要になります。しかし、議論のために、それは次のようになります。
var t = DesiredSym.GetType().GenericTypeArguments[0];
var props = t.GetProperties().Where(p => p.Name.StartsWith("Month"));
var sum = DesiredSym.AsEnumerable()
.Sum(s => props.Sum(p => (int)p.GetValue(s, null)));
または、これはリフレクションのより複雑な使用法ですが、データベース上で実行できるという利点があります。
var t = DesiredSym.GetType().GenericTypeArguments[0];
var param = Expression.Parameter(t);
var exp = t.GetProperties()
.Where(p => p.Name.StartsWith("Month"))
.Select(p => (Expression)Expression.Property(param, p))
.Aggregate((x, y) => Expression.Add(x, y));
var lambda = Expression.Lambda(exp, param);
var sum = DesiredSym.Sum(lambda);
ここで、これらのメソッド (3 番目を除く) に対して 5 つのバッチで合計を計算するには、MoreLINQのBatch
メソッド ( NuGet でも利用可能)を使用できます。
var DesiredSym =
from r in Symptoms
where r.Status.Equals(1) && r.Create_Date < TimespanSecs
select retireMe;
// first method
var batchSums = DesiredSym.Batch(5, b => b.Sum(s => s.Month1_Use ...));
// second method
var t = DesiredSym.GetType().GenericTypeArguments[0];
var props = t.GetProperties().Where(p => p.Name.StartsWith("Month"));
var batchSums = DesiredSym.Batch(5, b => b.Sum(s => props.Sum(p => (int)p.GetValue(s, null))));
これらの方法は両方とも少し遅くなり、すべての処理をメモリ内で実行する必要があるため、より多くのリソースを使用します。同じ理由で、MoreLinq はインターフェイスをサポートしていないため、3 番目の方法は機能しませんIQueryable
。