2013-08-23 3 views
0

MyObject 두 가지 속성이 int 유형에 p1p2 이름이, 지금은 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]; 
     } 

을하지만 말한다 :

foreachint[]

AnonymousType#1을 변환 할 수 없습니다.

어떻게 해결할 수 있습니까?

+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가 그러한 상황이 발생하지 않도록 (예 : 캐싱을 통해) 또는 귀하의 상황과 관련이 없을 수도 있습니다. 확실히 고려해야 할 사항입니다. 존 소총과 답변 jyparask 외에도

1

당신은 또한 시도 할 수 있습니다 :

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에서 group by git를 제거 할 수 있지만 LINQ에서 작업해야하는 방법입니다. 현재'.GroupBy (_ => 0)'은 람다가 사용되지 않고 효과적으로 0으로 그룹화하는 매개 변수를 받고 있음을 의미합니다. – Habib

관련 문제