如何从强类型数据集中的数据表中获取不同的值

本文关键字:数据表 获取 集中 强类型 数据 数据集 | 更新日期: 2023-09-27 18:18:36

我正在使用强类型数据集,其中有许多表…

问题是现在我想从

过滤数据
GetData()

函数,具有类似

的查询
select * from table_name

如何过滤一个特定的表和不同的值。此外,如果我尝试过滤它返回所有列,但其余的都有空值,除了一个我问,所以我不能分配它作为一个数据源到datagrid或组合框

如何从强类型数据集中的数据表中获取不同的值

DataTable的Select()方法呢?

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扩展方法,它将行数组转换为字符串数组。

你的问题不太清楚。我所理解的是,一个数据集中有多个表。现在要基于Table Name进行筛选。如果您通过在单个存储过程中编写多个选择查询来返回数据集中的多个表,那么就无法在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;
}

当我理解你的问题时,我做了一些快速的尝试来帮助,代码可以改进,必须是,我说我做得很快。

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中使用using,但这不是主题。