繁体   English   中英

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

[英]How to get distinct values from a datatable in strongly typed dataset

我正在使用强类型数据集,并且其中有很多表。

现在的问题是我想从中过滤数据

GetData()

具有类似查询的功能

select * from table_name

我如何过滤特定的表并从中区分出不同的值。 另外,如果我尝试对其进行过滤,则返回所有列,但其余字段为空值,但我要求的除外,因此我无法将其作为数据源分配给datagrid或combobox

我怎样才能做到这一点..

您的问题不是很清楚。 我了解的是,数据集中有多个表。 现在,您要根据表名称进行过滤。 如果要通过在单个存储过程中编写多个选择查询来返回数据集中的多个表,则无法用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;
}

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

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

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,但这不是主题。 希望对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM