2011-09-06 2 views
1

죄송합니다. 이미 어딘가에 물어 보았지만 찾지 못했습니다. 평균 및 합계는 익명 유형에서 작동하지 않는 것으로 보입니다. 나는이 코드를 작동 시키려면 잠시 동안 노력해왔다. 운이 없다.평균 및 합계가 익명 형식에서 작동하지 않습니까?

var trainingPlan = (from tp in context.TPM_TRAININGPLAN 
        join tpd in context.TPM_TRAININGPLANDELIVERABLES on tp.TRAININGPLANID equals tpd.TRAININGPLANID 
        join t in context.TPM_TASK on tpd.TASKID equals t.TASKID 
        where tp.TPM_PROJECTVERSION.PROJECTID == projectId && tp.TPM_PROJECTVERSION.VERSIONID == versionId && tp.TRAININGPLANTYPE == "prescribed" 
        select new 
        { 
         CourseLength = tp.COURSELENGTHHOUR * 60 + tp.COURSELENGTHMINUTE, 
         DeliveryMethod = tp.TPM_DELIVERYMETHODS.NAME, 
         CourseCode = t.COURSECODE 
        }); 

내가 지금 CourseLength 속성의 합을 먹고 싶어, 그래서 내가 할 : 내가 뭘 쿼리는

int sum = trainingPlan.Sum(l => l.CourseLength.Value); 

그러나, "합"을 0으로 같은 것을 끝 "평균". 디버거에서 trainingPlan에 CourseLength = 90 및 CourseLength = 150의 두 항목이 있음을 분명히 볼 수 있습니다.

합계는 이러한 유형의 열거 형에서 작동하지 않습니까? 감사!

+0

'합계()'가장 확실히 익명 형식에서 작동합니다 - 특히이 경우, 그것은 존재의 어떠한 익명이 존재하지 않는 경우 어떤 시점에서 SQL로 변환되었습니다. –

+0

DB 공급자를 통해 쿼리하는 경우 작동하지 않는다고 말하는 것입니까? 이 경우 모든 것을 "쿼리"한 다음 데이터베이스에서 수행하는 대신 오프라인에서 숫자를 "평균"수 있습니까? –

+0

어떤 LINQ 공급자 (EF, LINQ to SQL, ...)를 사용하고 있습니까? 생성 된 SQL을 볼 수 있습니까? – svick

답변

3

확실히 이것은 데이터베이스 제공 업체의 문제 일 수 있습니까? 이것은 작은 컬렉션이므로 trainingPlan.AsEnumerable(). Sum을 할 수 있습니다. 또는 여러 계산을 수행하는 경우 trainingPlan.ToList()를 수행하여이를 저장하고 계산에 사용하십시오.

+0

그래, 내가 ToList로 변환하면() 작동! 그래서 오라클 DB 공급자는 이런 종류의 쿼리를 지원하지 않는다고 생각합니다. 어쨌든 "새로운 쿼리"를 수행하는 이러한 호출에 대한 아이디어가 마음에 들지 않아 공급자 버그와 상관없이 더 나은 솔루션이라고 생각합니다. 하나의 질문, 어떤 데이터 형식 ToList 반환합니까? ToList()를 별도의 변수로 저장하려면 어떻게 선언해야합니까? 익명 형식의 List <>입니다. –

+0

오, 죄송합니다. duh : var list = trainingPlan.ToList(); –

+0

좋은 답변 : 나는 항상 linq에서 지연된 실행을 잊어 버린다. 정보가 투영 인 체크 아웃 : http://tomasp.net/articles/cannot-return-anonymous-type-from-method.aspx –

1

이 잘 작동 :

class Program { 
    static void Main(string[] args) { 
     var stuff = from i in new double[] { 1, 2, 3 } 
        select new { 
         Value = (int) i, 
        }; 

     var sum = stuff.Sum(s => s.Value); 
     Console.WriteLine(sum); 
    } 
} 

그렇게하려고 :

select new 
        { 
         CourseLength = (int) tp.COURSELENGTHHOUR * 60 + tp.COURSELENGTHMINUTE, 
         DeliveryMethod = tp.TPM_DELIVERYMETHODS.NAME, 
         CourseCode = t.COURSECODE 
        }); 

and int sum = trainingPlan.Sum(l => l.CourseLength); 
관련 문제