2011-08-28 2 views
3

나는 내가 먼저 VoteCount 필드의 모든 값을 합계 할 수 있도록 확장하려고하는 간단한 linq 쿼리를 가지고 있습니다. 후보자 후보자가받은 투표의 비율을 지정하고 싶습니다.방법 : 모든 값을 합친 다음 Linq의 총 비율 (%)을 SQL에 할당하십시오.

이 여기에 코드입니다 :

   TheVoteDataContext db = new TheVoteDataContext(); 
    var results = from n in db.Nominees 
        join v in db.Votes on n.VoteID equals v.VoteID 
        select new 
        { 
         Name = n.Name, 
         VoteCount = v.VoteCount, 
         NomineeID = n.NomineeID, 
         VoteID = v.VoteID 
        }; 

답변

7

각 후보에 대한 하나의 표를 선택하고 두 개의 서로 다른 작업을 모든 투표의 합을하는 계산 이후, 나는 효율적으로 하나 개의 쿼리에서이 작업을 수행하는 방법을 생각할 수 없다. 나는 단순히

var results = from n in db.Nominees 
       join v in db.Votes on n.VoteID equals v.VoteID 
       select new 
       { 
        Name = n.Name, 
        VoteCount = v.VoteCount, 
        NomineeID = n.NomineeID, 
        VoteID = v.VoteID 
       }; 

var sum = (decimal)results.Select(r=>r.VoteCount).Sum(); 
var resultsWithPercentage = results.Select(r=>new { 
           Name = r.Name, 
           VoteCount = r.VoteCount, 
           NomineeID = r.NomineeID, 
           VoteID = r.VoteID, 
           Percentage = sum != 0 ? (r.VoteCount/sum) * 100 : 0 
          }); 

또한 (집계 쿼리를 사용) 결과 이전의 합계를 계산 수 있기 때문에, 두 단계에서 할 것,이 데이터베이스 엔진에 합산하는 작업을 떠날 것이다. 나는 이것이 더 느릴 것이라고 생각하지만 항상 시도해 볼 수 있습니다 :)

+1

이 솔루션에서 컴파일 오류가 발생합니다. 오류 속성 또는 인덱서 'AnonymousType # 1.Percentage'를 (를) 할당 할 수 없습니다. 그것은 읽기 전용 – Donnie

+0

맞아, 나는 이것을 잊어 버렸다. (나는 익명의 클래스를 종종 사용하지 않는다.). 나는 최종 결과에 새로운 새로운 익명 클래스를 사용하여 솔루션을 수정 ... – MartinStettner

관련 문제