Linq计数行

时间:2014-10-20 07:18:36

标签: vb.net linq

我在数据表上有一个linq查询。我正在尝试计算我以前的linq查询。

Imports System.Data
Imports System.Linq

Sub TestThis()
    Dim t As New testLinq
    t.testLinqCount()
End Sub

Class testLinq

    Sub testLinqCount()
        'create new datatable
        Dim myQbCustTable As New DataTable
        For i As Integer = 1 To 5
            Dim col As New DataColumn
            myQbCustTable.Columns.Add(col)
        Next

        'add rows
        For i As Integer = 1 To 5
            Dim rw As DataRow = myQbCustTable.NewRow
            rw.Item(1) = 1200 + i
            myQbCustTable.Rows.Add(rw)
        Next

        'linq query
        Dim CustBalQuery = From Cust In myQbCustTable _
                           Select CustomerID = Cust.Item(1), _
                                    CustQBName = Cust.Item(2), _
                                    CustBal = Cust.Item(3) _
                                    Order By CustomerID

        'get count
        Dim ct As Integer = CustBalQuery.Count() '<error here
    End Sub
End Class

你能告诉我如何获得CustBalQuery的数量吗?我尝试了CustBalQuery.Count()并得到了这个错误:未找到类型'OrderedEnumerableRowCollection(VB $ AnonymousType_7(Of Object,Object,Object)')上的公共成员'Count'。

3 个答案:

答案 0 :(得分:1)

我创建了一个虚拟类型,它按预期工作: -

Module Module1

    Sub Main()
        Dim fruits As New List(Of Fruits)
        Dim fruit1 As New Fruits
        fruit1.FruitID = 1
        fruit1.FruitName = "Apple"
        fruits.Add(fruit1)

        Dim fruit2 As New Fruits
        fruit2.FruitID = 2
        fruit2.FruitName = "Banana"
        fruits.Add(fruit2)

        Dim fruit3 As New Fruits
        fruit3.FruitID = 3
        fruit3.FruitName = "Grapes"
        fruits.Add(fruit3)

        Dim query = From fruit In fruits
                    Select FruitID = fruit.FruitID, FruitName = fruit.FruitName
                    Order By FruitID

        Dim queryCount As Integer = query.Count()
        Console.WriteLine(queryCount)  //Getting output as 3
    End Sub

End Module

答案 1 :(得分:0)

我不确定如何解决它,但我发现我的问题归功于Jon Skeet的帮助。当我把代码放在一个新项目中时,它就可以立即运行。

'linq query
Dim CustBalQuery = From Cust In myQbCustTable _
                       Select CustomerID = Cust.Item(1), _
                                CustQBName = Cust.Item(2), _
                                CustBal = Cust.Item(3) _
                                Order By CustomerID

在我的旧项目CustBalQuery中是一个“对象”类型。在我的新项目中,CustBalQueryOrderedEnumerableRowCollection(Of VB$AnonymousType_7(Of Object,Object,Object))类型。

我不确定为什么会这样,但这就是CustBalQuery.Count()在我的旧项目中不起作用的原因。

答案 2 :(得分:0)

选项推断需要开启。升级项目时,有时会在属性页面编译选项卡中将Option Infer关闭。当我设置Option Infer On时,问题就消失了。

Option Infer, A VB.NET compile option just for LINQ By Dan Mabbutt