我使用强类型数据集,并有许多表..如何从数据表中获得不同的值在强类型数据集
的问题是,现在我想从
GetData()
过滤数据功能,其中有一个查询如
select * from table_name
如何过滤特定的表和不同的值从它。另外,如果我尝试对其进行过滤,返回所有列,但其余的都只是一个我问空值,所以我不能将其指定为数据源到datagrid
或ComboBox
我怎样才能做到这一点..
我使用强类型数据集,并有许多表..如何从数据表中获得不同的值在强类型数据集
的问题是,现在我想从
GetData()
过滤数据功能,其中有一个查询如
select * from table_name
如何过滤特定的表和不同的值从它。另外,如果我尝试对其进行过滤,返回所有列,但其余的都只是一个我问空值,所以我不能将其指定为数据源到datagrid
或ComboBox
我怎样才能做到这一点..
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扩展方法,它将行数组转换为一个字符串数组。
但这会给整个列,我只想一个单列返回 – 2011-12-23 09:11:38
只是想象一下,如果这个表有1000万行,然后使用你的技术会使系统崩溃,或者使用可能会休眠等待过程完成 – 2012-01-17 19:22:44
为什么你会在内存中使用1000万行?如果你有很多行,你需要在你的SQL查询中进行过滤。 – codeConcussion 2012-01-17 21:25:50
你问题不是很清楚。我所理解的是,你有多个表进入数据集。现在你想根据表名进行过滤。如果通过在单个存储过程中写入多个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;
}
正如我理解你的问题,我做了一些快速尝试帮助,代码可以改善,必须是,我怎么说我做得很快。
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中,但这不是话题。 我希望它能帮助你。
为什么要在C#级别上进行过滤?为什么不在数据库端使用它? – 2011-12-23 14:59:30
我可以查询数据库的不同,但我认为我们已经有一个函数GetData()返回所有行,我们可以过滤其余的C#或vb.net – 2011-12-26 05:59:50