2011-12-23 76 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中,但这不是话题。 我希望它能帮助你。

相关问题