2011-12-23 71 views
0

我使用強類型數據集,並有許多表..如何從數據表中獲得不同的值在強類型數據集

的問題是,現在我想從

GetData() 

過濾數據功能,其中有一個查詢如

select * from table_name 

如何過濾特定的表和不同的值從它。另外,如果我嘗試對其進行過濾,返回所有列,但其餘的都只是一個我問空值,所以我不能將其指定爲數據源到datagrid或ComboBox

我怎樣才能做到這一點..

+0

爲什麼要在C#級別上進行過濾?爲什麼不在數據庫端使用它? – 2011-12-23 14:59:30

+0

我可以查詢數據庫的不同,但我認爲我們已經有一個函數Ge​​tData()返回所有行,我們可以過濾其餘的C#或vb.net – 2011-12-26 05:59:50

回答

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

注意,這兩個Select()方法是不同的更新代碼示例。第一個是過濾行的DataTable方法。第二個是一個linq擴展方法,它將行數組轉換爲一個字符串數組。

+0

但這會給整個列,我只想一個單列返回 – 2011-12-23 09:11:38

+0

只是想象一下,如果這個表有1000萬行,然後使用你的技術會使系統崩潰,或者使用可能會休眠等待過程完成 – 2012-01-17 19:22:44

+0

爲什麼你會在內存中使用1000萬行?如果你有很多行,你需要在你的SQL查詢中進行過濾。 – codeConcussion 2012-01-17 21:25:50

0

你問題不是很清楚。我所理解的是,你有多個表進入數據集。現在你想根據表名進行過濾。如果通過在單個存儲過程中寫入多個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 

和呼叫像這樣

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中,但這不是話題。 我希望它能幫助你。

相關問題