簡體   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