如何从强类型数据集中的数据表中获取不同的值
本文关键字:数据表 获取 集中 强类型 数据 数据集 | 更新日期: 2023-09-27 18:18:36
我正在使用强类型数据集,其中有许多表…
问题是现在我想从
过滤数据GetData()
函数,具有类似
的查询select * from table_name
如何过滤一个特定的表和不同的值。此外,如果我尝试过滤它返回所有列,但其余的都有空值,除了一个我问,所以我不能分配它作为一个数据源到datagrid
或组合框
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扩展方法,它将行数组转换为字符串数组。
你的问题不太清楚。我所理解的是,一个数据集中有多个表。现在要基于Table Name进行筛选。如果您通过在单个存储过程中编写多个选择查询来返回数据集中的多个表,那么就无法在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;
}
当我理解你的问题时,我做了一些快速的尝试来帮助,代码可以改进,必须是,我说我做得很快。
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,但这不是主题。