Как получить отличные значения из таблицы данных в строго типизированном наборе данных - PullRequest
0 голосов
/ 23 декабря 2011

Я использую строго типизированный набор данных и у меня много таблиц в этом ..

Проблема теперь в том, что я хочу отфильтровать данные из

GetData()

функция с запросом типа

select * from table_name

Как я могу отфильтровать конкретную таблицу и отличные от нее значения. Также, если я пытаюсь отфильтровать его, возвращаются все столбцы, но остальные имеют нулевые значения, кроме того, который я запросил, поэтому я не могу назначить его как источник данных для datagrid или комбинированного списка

Как я могу это сделать ..

Ответы [ 3 ]

0 голосов
/ 23 декабря 2011

Как насчет метода Select () в DataTable?

DataRow[] filtered = someDataSet.SomeDataTable.Select("Status = 'Active'");

Редактировать:
Обновленный пример кода после комментария OP

using System.Linq;
...
DataRow[] rows = someDataSet.SomeDataTable.Select("Status = 'Active'");
string[] columnValues = row.Select(x => x["SomeColumnName"].ToString());

Обратите внимание, что два метода Select() различны.Первый - это метод DataTable, который фильтрует строки.Второй - это метод расширения linq, который преобразует массив строк в массив строк.

0 голосов
/ 23 декабря 2011

Когда я понял ваш вопрос, я сделал что-то быстрое, чтобы попытаться помочь, код может быть улучшен и, как я сказал, я сделал это быстро.

Public Module DataSetExtensions
    <Runtime.CompilerServices.Extension()>
    Public Function [Select](ds As DataSet, table As String, ParamArray campos() As String) As DataTable
        Dim dt As New DataTable
        Dim sourceTable = (From t As DataTable In ds.Tables _
            Where t.TableName = table).SingleOrDefault

        Dim columnas = From c As DataColumn In sourceTable.Columns Where campos.Contains(c.ColumnName)

        columnas.ToList.ForEach(Sub(c) dt.Columns.Add(c.ColumnName))

        For Each row As DataRow In sourceTable.Rows
            Dim newRow As DataRow = dt.NewRow
            For Each col As DataColumn In sourceTable.Columns
                If columnas.Contains(col) Then
                    newRow(col.ColumnName) = row(col)
                End If
            Next
            dt.Rows.Add(newRow)
        Next

        Return dt
    End Function

    <Runtime.CompilerServices.Extension()>
    Public Function [Select](table As DataTable, ParamArray campos() As String) As DataTable
        Dim dt As New DataTable

        Dim columnas = From c As DataColumn In table.Columns Where campos.Contains(c.ColumnName)

        columnas.ToList.ForEach(Sub(c) dt.Columns.Add(c.ColumnName))

        For Each row As DataRow In table.Rows
            Dim newRow As DataRow = dt.NewRow
            For Each col As DataColumn In table.Columns
                If columnas.Contains(col) Then
                    newRow(col.ColumnName) = row(col)
                End If
            Next
            dt.Rows.Add(newRow)
        Next

        Return dt
    End Function
End Module

И звонок как-то так

Using ds As New DataSet1()
    Using ta As New DataSet1TableAdapters.BCR_SOLICITUDTableAdapter()
        ta.Fill(ds.BCR_SOLICITUD)
        Dim dt As DataTable
        ' First extended method
        dt = ds.Select("BCR_SOLICITUD", "Numero", "Estado", "Descripción")
        ' Second extended method
        dt = ds.BCR_SOLICITUD.Select("Numero","Estado", "Descripción")
        'Code here
        dt.Dispose
        dt=Nothing
    End Using
End Using

Вы можете использовать использование в DataTable, но это не тема. Я надеюсь, что это поможет вам.

0 голосов
/ 23 декабря 2011

Ваш вопрос не очень понятен. Я понял, что у вас есть несколько таблиц, входящих в набор данных. Теперь вы хотите фильтровать по имени таблицы. Если вы возвращаете несколько таблиц в наборе данных, написав несколько запросов на выборку в одной хранимой процедуре, вы не сможете назвать таблицы в sql. Вы должны получить доступ к нему жестко закодированным способом. Другим способом может быть добавление таблицы в 0-ю позицию, и в этой таблице добавьте имя таблицы и позицию, которая будет в DataSet при возврате запроса. Таким образом, первый запрос в вашей хранимой процедуре будет возвращать таблицу, которая имеет соответствие между именем таблицы и положением, в котором они находятся в DataSet. Теперь функция GetData () стала бы очень простой.

function DataTable GetData(string tableName)
{
  //Supposing 0th table is mapping table with 2 columns, One contains Name and another   position
   var pos = ds.Tables[0].where(x => x[0] == tableName).Select(x => x[1]).firstOrDefault();
   var table = ds.Tables[pos];
   return table;
}
...