0

MyObjectp1とタイプの 2 つのプロパティがあります。今、それぞれのp2取得と加算が必要です。私はこれを試しました:intMyObjectp1p2

int p1Sum = 0, p2Sum = 0;
foreach (int[] ps in new MyEntity().MyObject.Select(o => new { o.p1, o.p2 }))
       {
            p1Sum += ps[0];
            p2Sum += ps[1];   
       } 

しかし、次のように述べています。

に変換できませAnonymousType#1int[]

オンforeach

どうすればこれを修正できますか?

4

3 に答える 3

2
foreach (var ps in new MyEntity().MyObject.Select(o => new { o.p1, o.p2 }))
       {
            p1Sum += ps.p1;
            p2Sum += ps.p2;   
       } 
于 2013-08-23T13:09:29.933 に答える
1

Jon Skeet と jyparask の回答に加えて、次のことも試すことができます。

var result = (new MyEntity().MyObject
             .GroupBy(_=> 0)
             .Select(r=> new 
                   {
                    p1Sum = r.Sum(x=> x.p1)
                    p2Sum = r.Sum(x=> x.p2)
                   })
             .FirstOrDefault();

上記の結果、Sum両方の列に対してのみ単一のクエリがフェッチされます。パフォーマンスが気になる場合は、生成されたクエリとその実行計画を確認できます。

if(result != null) 
  {
   Console.WriteLine("p1Sum = " + result.p1Sum);
   Console.WriteLine("p2Sum = " + result.p2Sum);
  }
于 2013-08-23T13:23:18.933 に答える
1

jyparask の答えは間違いなく機能しSumますが、代わりに 2 回使用することを検討する価値があります。2 回のデータベース呼び出しが必要になりますが、個々の値をすべてローカルに取得することを (チェックしてください!) 避けることができます。

var entities = new MyEntity().MyObject;
var p1Sum = entities.Sum(x => x.p1);
var p2Sum = entities.Sum(x => x.p2);

ここで、少なくとも論理的Sumに矛盾が生じる可能性があります。いくつかのエンティティが 2 つの呼び出しの間で削除または追加される可能性があります。ただし、EF はそれが起こらないことを保証する可能性があります (たとえば、キャッシュを介して)、または状況に関連しない可能性があります。それは間違いなくあなたが考えるべきことです。

于 2013-08-23T13:13:19.260 に答える