2011-12-23 7 views
0

強く型付けされたデータセット内のデータテーブルから異なる値を取得する私は強く型付けされたデータセットを使用して、その中で多くのテーブルを持っています。..問題は今どのように

私は

GetData() 

からデータをフィルタリングします関数のようなクエリを持っている

select * from table_name 

どのように私は特定のテーブルとそれから別の値をフィルタリングできますか?また、私は尋ねたものを除いNULL値を持っているので、私はこれをどのように行うことができますdatagridまたはコンボボックス

へのデータソースとして割り当てることができない、それはすべての列が、残りを返すフィルタリングしようとすると...

+0

なぜC#レベルでフィルタリングしたいのですか?なぜそれをデータベース側で使用しないのですか? –

+0

私は別のデータベースを照会することができますが、私はすでにすべての行を返す 'GetData()'関数を持っていると思っており、残りの部分をC#またはvb.net –

答えて

0

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()); 

注次のコードサンプルを更新し、2つのSelect()の方法が異なっています。最初は、行をフィルタリングするDataTableメソッドです。 2番目の方法は、行の配列を文字列の配列に変換するlinq拡張メソッドです。

+0

でフィルタリングできます。 –

+0

を返すシングル列は、このテーブルに1000万行があり、テクニックを使用するとシステムがクラッシュするか、プロセスが完了するのを待ってスリープ状態になるかもしれません。 –

+0

なぜ1,000万行のメモリで作業するのですか?その行が多い場合は、SQLクエリでフィルタリングを行う必要があります。 – codeConcussion

0

あなた質問はあまり明確ではない。私が理解していることは、複数のテーブルがデータセットに入っていることです。これで、テーブル名に基づいてフィルタリングします。 1つのストアドプロシージャに複数のselectクエリを記述して複数のテーブルを返す場合は、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; 
} 
0

私はあなたの質問を理解していたので、私は手助けしようとすばやくやりました。コードを改善することができます。

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 

、あなたがたDataTableで使用して使用することができ、この

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 

ような呼び出し何かが、これはトピックではありません。 私はそれがあなたを助けてくれることを願っています。

関連する問題