【问题标题】:Linq statement returning same results for all entriesLinq 语句为所有条目返回相同的结果
【发布时间】:2015-05-15 05:49:56
【问题描述】:

我需要编写一个 linq 语句来编码成绩显示按钮,以便用户可以显示所有记录或仅显示与特定成绩匹配的记录。它还必须计算一个gpa,其中a=4b=3c=2d=1f=0。我已更改代码以实现 where 子句,但我得到了 但我得到一个错误 对于成绩说 option strict on disallows 隐式转换 string to boolean 谁能给我关于这个where子句的建议?

     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]

【问题讨论】:

    标签: vb.net linq


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      LINQ 查询中的变量范围与其他任何地方的工作方式相同。因此,例如,如果您的查询在循环中,则变量 Grade 必须在该循环的范围内。

      如果您指定当前在何处以及如何宣布成绩,这将有助于提供更具体的答案。

      【讨论】:

        【解决方案3】:

        假设您想将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)

        【讨论】:

        • 当我以这种方式尝试@Maciej Los 时,我在 select 语句中遇到了无效的强制转换异常错误
        • r.Field(Of Double)("CreditHours")更改为适当的数据类型,例如:Integer
        • 感谢您的帮助,我将其更改为整数,但现在我得到了 68 的所有成绩计算。我会继续调整它
        • 好的,我为你祈祷;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 2016-12-05
        相关资源
        最近更新 更多