2015-05-04 47 views
0

我需要編寫一個linq語句來編碼等級顯示按鈕,以便它允許用戶顯示所有記錄或只顯示與特定等級匹配的記錄。還必須計算出一個gpa,其中a=4,b=3,c=2,d=1,f=0。我已經改變了代碼來實現where子句,但我得到 ,但我得到一個錯誤 爲選項嚴格禁止從 字符串到布爾值隱式轉換任何人都可以給我這個where子句的建議嗎?Linq語句爲所有條目返回相同的結果

 Private Sub btnDisplay_Click(sender As Object, e As EventArgs) Handles btnDisplay.Click 

    Dim dic As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer) 
    dic.Add("A", 4) 
    dic.Add("B", 3) 
    dic.Add("C", 2) 
    dic.Add("D", 1) 
    dic.Add("F", 0) 



    Dim gpa = Aggregate Grade In CoursesDataSet.tblCourses.AsEnumerable() 
     Where Grade.Grade = "A" Or "B" Or "C" Or "D" Or "F" 
     Select Grade.Field(Of Integer)("CreditHours") * dic(Grade.Field(Of String)("Grade")) 
     Into Sum() 




    MessageBox.Show("GPa:" & gpa.ToString(CInt("C2")), 
        "College Courses", MessageBoxButtons.OK, 

MessageBoxIcon.Information)

End Sub 

末級

![enter image description here][1] 

回答

0

在LINQ查詢變量的作用域的工作方式相同其他地方。例如,如果你的查詢是在一個循環內,你的變量Grade必須在該循環的範圍內。

如果您指定目前在哪裏以及如何聲明成績,它將有助於提供更具體的答案。

0

假設你想「翻譯」Grade到相應的數值,我建議使用Dictionary

Dim dic As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer) 
dic.Add("A", 4) 
dic.Add("B", 3) 
dic.Add("C", 2) 
dic.Add("D", 1) 
dic.Add("F", 0) 

現在,您可以彙總數據以獲得等級總和。

'LinqToDataSet example: 
Dim qry = Aggregate r In CoursesDataSet.tblCourses.AsEnumerable() 
      Select r.Field(Of Double)("CreditHours") * dic(r.Field(Of String)("Grade")) 
      Into Sum() 

如需進一步信息,請訪問:Linq To DataSet Examples (VB.NET)

+0

當我嘗試這樣@Maciej洛杉磯我得到一個無效轉換異常錯誤在SELECT語句 – tammy

+0

什麼是確切的錯誤信息? –

+0

這是一張圖片http://i59.tinypic.com/33vybeu.png – tammy

1

我工作的這個確切的問題。事實上,我們可能在同一班! 我分等級爲骨料和的每個類別聲明字母等級爲常量後:

 Dim ALetterAvg As Double = 
     Aggregate ID In CoursesDataSet.tblCourses 
     Where ID.Grade.ToUpper = "A" 
     Select (ID.CreditHours * gradeAPoints) Into Sum() 

聚集的總小時數:

 Dim totalHours As Double = 
     Aggregate hrs In CoursesDataSet.tblCourses 
     Select hrs.CreditHours Into Sum() 

然後通過的總小時數除以等級總和:

 Dim GPA As Double = (ALetterAvg + BLetterAvg + CLetterAvg + DLetterAvg + FLetterAvg)/totalHours