Преобразовать набор результатов запроса LINQ в таблицу данных - PullRequest
3 голосов
/ 20 июля 2010

Как я могу написать этот запрос с 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

к чему относится эта ошибка?

Ответы [ 4 ]

2 голосов
/ 30 мая 2014

Я искал несколько дней и, наконец, наткнулся на эту замечательную функцию, написанную Лусом Оливейрой, которая преобразовывает результат 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 голосов
/ 26 июля 2010

Вы можете пропустить DataTable все вместе и использовать LINQ to VFP .

0 голосов
/ 21 июля 2010

Измените следующую строку

Dim table As DataTable = q.ToDataTable() 

до

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

тогда вы можете попробовать связать его с GridView

DataGridView1.DataSource = table    
DataGridView1.DataBind()
0 голосов
/ 20 июля 2010

Ваш запрос тянет КАЖДУЮ запись ... если вы хотите подсчитать, вы можете просто сделать ...

select COUNT(*) from Table1

или, чтобы явно назвать результирующий столбец OF count ...

select COUNT(*) as CountOfRecords from Table1

Если вы хотите умышленно опустить все записи и узнать, сколько фактических записей в наборе результатов (полная таблица или где применено предложение) ... Вы можете получить результаты из

int TotalRecords = dt.Rows.Count

Мой плохой ... сгруппировать по пунктам ...

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

Тогда dt.Rows.Count будет иметь количество возвращаемых в список «ЭЛЕМЕНТОВ» ... После этого вы сможете прокручивать записи по каждому элементу и иметь соответствующее количество для этого элемента.

...