1

これを行うにはおそらく100のはるかに簡単な方法があることは知っていますが、それを見るまで、どうすればよいのか理解できません。これにはlinqpadを使用しています。フェーズ 2 に進む前に、この部分を機能させる必要があります。

SQL データベースに接続しました。必要なレコードを取得するクエリを実行しています。

var DesiredSym = (from r in Symptoms
where r.Status.Equals(1) && r.Create_Date < TimespanSecs  
select r).Take(5);

したがって、この例では、基本的に DesiredSym 変数で iQueryable として 5 つの「レコード」を取得します (linqpad はこれを教えてくれます)。

DesiredSym には、Month1_Used、Month2_Used、Month3_Used .... Month12_Use の int を保持する多数のフィールドを含む多数のフィールドが含まれています。

したがって、DesiredSym をループして、基本的にすべての Monthx_Used フィールドの合計を取得したいと考えています。

foreach (var MonthUse in DesiredSym)
{
  // get sum of all fields where they start with MonthX_Used;
}

これは、どのように進めればよいのか、あるいは正しい軌道に乗っているのかさえはっきりしないところです。私を正しい軌道に乗せてくれてありがとう。

4

1 に答える 1

2

静的な数のフィールドがあるため、これをお勧めします。

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 つのバッチで合計を計算するには、MoreLINQBatchメソッド ( 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

于 2013-07-18T13:34:45.000 に答える