0

MyObject有两个名为p1和类型p2的属性int;现在我想为每个MyObjectp1p2加起来。我试过这个:

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两次 - 它会涉及两个数据库调用,但它可能(检查!)避免在本地获取所有单个值:

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

现在至少在逻辑上存在不一致的可能性 - 在两个Sum调用之间可能会删除或添加一些实体。但是,EF 可能会确保不会发生这种情况(例如通过缓存),或者它可能与您的情况无关。这绝对是你应该考虑的事情。

于 2013-08-23T13:13:19.260 回答