2011-09-06 60 views
1

對不起,如果這已被問到某處,但我無法找到它。看來平均值和總和不適用於匿名類型。我一直在嘗試一段時間才能使此代碼運行,但沒有運氣。我做的查詢是:Average和Sum不適用於匿名類型?

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.

難道Sum只是不適用於這些類型的枚舉?謝謝!

+0

'總和()'最肯定適用於匿名類型 - 尤其是在這種情況下,如果沒有匿名類型,因爲它是被在某些時候轉換爲SQL。 –

+0

所以你說它只是在通過數據庫提供者查詢時不起作用?在這種情況下,我可以「查詢」所有內容,然後將數字「平均」爲離線數據,而不是讓數據庫執行此操作嗎? –

+0

您使用的LINQ提供程序(EF,LINQ to SQL,...)?你可以看看生成的SQL嗎? – svick

回答

3

肯定這可能是數據庫提供商的問題?由於這是一個小集合,你可以做trainingPlan.AsEnumerable()。Sum。或者,如果您正在進行多個計算,請執行trainingPlan.ToList(),將其存儲並在計算中使用它。

+0

是的,當我轉換爲ToList () 有用!所以我猜Oracle數據庫提供者不支持這種查詢。無論如何,我真的不喜歡這些調用「新查詢」的想法,所以我認爲這是一個更好的解決方案,不管提供者的錯誤。一個問題,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);