2015-05-04 50 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