将LINQ查询结果集转换为DataTable

3

如何使用LINQ查询FoxPro数据库?

SELECT count(*) FROM Table group by item1

我写的代码如下,但是它不能正常工作。
Dim Query

Dim dt As New DataTable

Dim da = New Odbc.OdbcDataAdapter("SELECT * FROM  table1",connection)
da.Fill(dt)

Query = (From row In dt.AsEnumerable Select row_
          Group By item1 = row.Item(6) Into_       
         count = Count(row.Item(6))).ToList

以下代码行可正常运行:
    Dim q = From p In dt Group p By item = p.Item(6) Into count = Count()

如何将上述查询的结果绑定到 GridView?不幸的是,将 q 设置为数据源不起作用。

    grid.DataSource= q

我发现我应该这样绑定它:

    Dim table As DataTable = q.ToDataTable()
    DataGridView1.DataSource = table

但是我遇到了如下错误。
    'copytodatatable' is not a member of 'System.Collections.Generic.IEnumerable

这个错误是指什么?

我想要执行 "SELECT count(*) FROM Table group by item1" 的结果,但是我的上述查询返回了另一个结果。而且我也想将结果绑定到数据表格中,例如 grid.datasource=Query,但是它也不起作用。 - Mahsa
4个回答

2

我搜索了好几天,最终找到了由Lus Oliveira编写的一个很棒的函数,可以将LINQ结果转换为DataTable。(文章) 以下是实际函数:

    Public Function EQToDataTable(ByVal parIList As System.Collections.IEnumerable) As System.Data.DataTable
    Dim ret As New System.Data.DataTable()
    Try
        Dim ppi As System.Reflection.PropertyInfo() = Nothing
        If parIList Is Nothing Then Return ret
        For Each itm In parIList
            If ppi Is Nothing Then
                ppi = DirectCast(itm.[GetType](), System.Type).GetProperties()
                For Each pi As System.Reflection.PropertyInfo In ppi
                    Dim colType As System.Type = pi.PropertyType
                    If (colType.IsGenericType) AndAlso
                       (colType.GetGenericTypeDefinition() Is GetType(System.Nullable(Of ))) Then colType = colType.GetGenericArguments()(0)
                    ret.Columns.Add(New System.Data.DataColumn(pi.Name, colType))
                Next
            End If
            Dim dr As System.Data.DataRow = ret.NewRow
            For Each pi As System.Reflection.PropertyInfo In ppi
                dr(pi.Name) = If(pi.GetValue(itm, Nothing) Is Nothing, DBNull.Value, pi.GetValue(itm, Nothing))
            Next
            ret.Rows.Add(dr)
        Next
        For Each c As System.Data.DataColumn In ret.Columns
            c.ColumnName = c.ColumnName.Replace("_", " ")
        Next
    Catch ex As Exception
        ret = New System.Data.DataTable()
    End Try
    Return ret
End Function

这个函数被以下代码调用:

dim q = [linq query you  write]
Dim dt as DataTable = EQToDataTable(q)

2
你可以完全跳过 DataTable 直接使用 LINQ to VFP

0

你的查询正在拉取每一条记录...如果你只想要计数,你可以这样做...

select COUNT(*) from Table1

或者,为了明确命名计数的结果列...

select COUNT(*) as CountOfRecords from Table1

如果您想有意地拉取所有记录并知道结果集中实际记录的数量(完整表格或应用 where 子句)... 您可以从以下位置获取结果。
int TotalRecords = dt.Rows.Count

我的错...按项目分组...

select item, count(*) as TotalPerItem from Table1 group by item

然后,dt.Rows.Count 将会返回列表中有多少个“ITEMS”... 然后您就可以按每个项目滚动记录,并获得该项目的相应计数。


但是这个查询不会被计算在分组中吗?它会返回一个分组的结果。 - Mahsa

0

修改以下行

Dim table As DataTable = q.ToDataTable() 

Dim table As DataTable = q.ToDataTable().AsEnumerable()

然后您可以尝试将其绑定到GridView

DataGridView1.DataSource = table    
DataGridView1.DataBind()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接