VB.NET:DataTable上的LINQ查询 - WHERE Id> = 0

时间:2016-05-20 16:00:44

标签: database vb.net linq

嘿人,

我正在修复我的一些朋友的应用程序。他们使用VB.NET和Windows Forms,而我在团队C#/ WPF / ASP。我对LINQ的了解也非常有限,即使它的所有.NET都是如此。我希望你能帮助我。

情况
表格上有两个组合。 他们从同一个表状态获取数据 状态对象的顺序取决于id列 第二个组合应仅包含id为> = combo1.id的状态。这样用户只能在第二个组合中选择状态为"更大 - 相等"比第一个组合中的状态 最小的status.id是3。

代码
(请忽略 index 等无用的后退和前进演员等。我想向你展示代码,因为我已将其复原了。)

                    Dim index As String = cmbStatusFrom.SelectedValue.ToString()
                    If index = "0" Then
                        index = "1"
                    End If

                    Dim query As IEnumerable(Of DataRow) = _
                        From status In ContextDataTable.AsEnumerable() _
                        Where status.Field(Of Integer)("Id") >= Integer.Parse(index) _
                        Select status

问题
没有

If index = "0" Then  
    index = "1"  
End If

生成的数据表包含的行多于应该的行数。 (0表示在第一个组合中选择了空项目)该行的id = 0(就像空行一样)

同样,最小的现有id是3.因此,如果使用> = 0,1,2或3,它应该没有任何区别。但它看起来确实如此。或者更可能的是,代码中存在一些非常愚蠢的错误,我无法找到。

任何人都知道问题是什么?

我非常感谢任何帮助。 : - )

greetz steven

1 个答案:

答案 0 :(得分:0)

我想帮忙,但我不太确定我理解你的问题。根据您在此处获得的信息,该代码应该有效。唯一未知的是组合值的实际数据类型,但除非.Field(Of T)抛出InvalidCastException,否则你应该很好。我编写了以下代码并将其投入单元测试项目,一切都很好。 。 。至少在结果数据集的长度方面。

代码

<TestCase(0, ExpectedResult:=4)>
    <TestCase(1, ExpectedResult:=4)>
    <TestCase(2, ExpectedResult:=3)>
    <TestCase(3, ExpectedResult:=2)>
    <TestCase(4, ExpectedResult:=1)>
    <TestCase(5, ExpectedResult:=0)>
    Public Function tmptest(ByVal selected As Integer) As Integer

        Dim d As New DataTable
        d.Columns.Add(New DataColumn("id", GetType(Integer)))
        For j = 0 To 5
            Dim r = d.NewRow()
            r("id") = j
            d.Rows.Add(r)
        Next

        If selected = 0 Then selected = 1
        Dim query = From status In d.AsEnumerable()
                    Where status.Field(Of Integer)("id") > selected
                    Select status


        Return query.Count
    End Function

结果

Test Results