2013-08-23 110 views
0

MyObject有兩個屬性在int類型命名爲p1p2;現在我要爲每個MyObject採取p1p2和添加這些了。我嘗試這樣做:如何正確選擇多個屬性?

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

我該如何解決這個問題?

+0

我真的不知道應該接受哪個答案!所有答案都是完美的! –

回答

2
foreach (var ps in new MyEntity().MyObject.Select(o => new { o.p1, o.p2 })) 
     { 
      p1Sum += ps.p1; 
      p2Sum += ps.p2; 
     } 
1

jyparask的答案肯定會工作,但它是值得使用Sum,而不是兩次考慮 - 這將涉及到兩個數據庫調用,但它可能(查看!)避免在本地獲取所有的單個值:

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

現在至少有在邏輯上這裏的不一致的可能性 - 一些實體可能會被刪除或添加兩個Sum調用之間。但是,EF有可能確保不會發生(例如通過緩存),或者它可能與您的情況無關。這絕對是你應該考慮的事情。

1

除了喬恩斯基特和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); 
    } 
+0

爲什麼'.GroupBy(_ => 0)'需要? –

+0

@majidgeek,這裏GroupBy並不是真的需要,但是在一個查詢中使用兩個不同的總和。 EF可能會優化這個查詢,並通過SQL刪除組,但這就是在LINQ中工作所需要的。 在當前'.GroupBy(_ => 0)'意味着lambda接收一個未被使用的參數,並且有效地被0分組。 – Habib