2009-09-27 4 views
0

데이터베이스에서 가져 오는 내용을 어떻게 추가 할 수 있습니까?

courseName : English101 
Mark : 80 
OutOff : 100 
Weight : 50 

CourseName : English101 
Mark : 30 
OutOff : 50 
Weight : 10 

CourseName: Chem101 
Mark : 100 
OutOff: 100 
Weight : 100 

지금 나는이 과정

처음있는 영어

모두에 대한 모든 학년에 걸쳐를 찾으려면 내 데이터베이스에이 말해봐.

(1백분의 80) * (50) = 40 (달성 중량) (50분의 30) * 10 = 6

40 + 6 = 100분의 46 (코스 중량 항상 100 %가 전체 것 -이 가중치의 40 %는 아직 배포되지 않았지만 overallMark를 다시 계산 함을 의미합니다.)

이 학생이 영어 101을 중퇴하면 최종 점수는 46 %가됩니다.

이제는이 작업을 수행하는 방법을 모르겠습니다. 처음에는 데이터베이스에서 검색 할 때 그룹화 및 합계 기능을 사용하여 모든 표시, outOff 및 가중치를 합산하려고했습니다.

그러나 이것은 내가 예상하는 것보다 다른 퍼센트를 제공합니다. 그래서 나는 그것을 한 줄씩 할 필요가있다.

그래서 각 줄을 추가 한 다음 모든 줄이 English101에서 말하고 달성 된 무게를 더해야합니다.

하지만 어떻게해야합니까? 사전을 사용하고 courseName을 키로 사용하고 다음 행에 동일한 courseName이 있는지 확인하려고했습니다. 그런 다음 사전에서 현재 값을 가져 와서 추가합니다.

그러나 나는 그것을 만드는 과정의 절반 밖에하지 못했고 foreach 루프와 3 개의 중첩 된 if 문이있었습니다.

그래서 더 좋은 방법이 있어야합니다.

나는 linq to sql을 사용하고 있습니다. 데이터베이스에서 오는 동안이 모든 작업을 수행 할 수 있는지 확신 할 수 없습니다.

+0

"(30/50) * 10 = 6"정말입니까? – APC

+0

@APC 예, .6 * 10 = 6. – phoebus

+0

Ooops, 아침 일찍이 질문을 보지 말아야합니다. ( – APC

답변

1

방법에 대해 : 객체에 LINQ에서

var results = from course in courses 
       where course.OutOf != 0 
       group course by course.CourseName into grouped 
       select new { CourseName = grouped.Key, 
          Mark = grouped.Sum(item => 
            (item.Mark * item.Weight)/item.OutOf) }; 

테스트 :

using System; 
using System.Linq; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     var courses = new[] 
     { 
      new { CourseName = "English101", Mark = 80, OutOf = 100, Weight =50}, 
      new { CourseName = "English101", Mark = 30, OutOf = 50, Weight = 10}, 
      new { CourseName = "Chem101", Mark = 100, OutOf = 100, Weight = 100 } 
     }; 

     var results = from course in courses 
       where course.OutOf != 0 
       group course by course.CourseName into grouped 
       select new { CourseName = grouped.Key, 
          Mark = grouped.Sum(item => 
            (item.Mark * item.Weight)/item.OutOf) }; 

     foreach (var result in results) 
     { 
      Console.WriteLine(result); 
     } 
    } 
} 

내가이 데이터베이스에 끝나면 당신은 정수 연산과 분열에 대해 걱정해야합니다 여부를 알 수없는 ... 합계의 각 비트의 결과가 잘 리기를 원하지 않을 수도 있습니다.

유효한 행의 가중치가 여전히 적절한 값이되기 때문에 일부 행이 누락된다는 사실은 부적합합니다.

+0

와우 나는 Mark * Weight/OutOf를하는 것에 대해 모든 생각을했을 것이라고 생각하지 않습니다. 수학 Genuies 롤 나는 당신이 "정수 산술과 산술을 데이터베이스에서 다룰 때 걱정할 필요가 있는지 여부를 모르겠다. 각 비트의 결과를 원하지 않을 수도있다. " 또한 overAllGrade가 없더라도 코스 접두사를 붙잡고 싶다는 언급을 했어야합니다. 이것은 아무것도 채우지 않은 코스 (즉, db가 null 인 경우)를 잉태하는 것으로 보입니다. – xiao

+0

오, 또 다른 문제는 null 값을 가지고 있기 때문에 0으로 나누기 오류 일 수 있습니다. – xiao

+0

마크가없는 코스를 포함 시키려면 null 통합 연산자 'item.Mark ?? 0' 등입니다. 정밀도 부분은 (말) 12.5의 두 부분 표식을 더하고 25 대신 24로 끝나는 문제를 피하는 것입니다. 정수 계산의 모든 작업을 수행하면 결과가 나오기 전에 반올림됩니다. 합계는 이상적이지 않습니다. –

관련 문제