![](/img/trans.png)
[英]How to Insert values to strongly typed DataSet from code and then show it from RDLC reporting page?
[英]How to get distinct values from a datatable in strongly typed dataset
我正在使用强类型数据集,并且其中有很多表。
现在的问题是我想从中过滤数据
GetData()
具有类似查询的功能
select * from table_name
我如何过滤特定的表并从中区分出不同的值。 另外,如果我尝试对其进行过滤,则返回所有列,但其余字段为空值,但我要求的除外,因此我无法将其作为数据源分配给datagrid
或combobox
我怎样才能做到这一点..
您的问题不是很清楚。 我了解的是,数据集中有多个表。 现在,您要根据表名称进行过滤。 如果要通过在单个存储过程中编写多个选择查询来返回数据集中的多个表,则无法用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;
}
数据表的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扩展方法,它将行的数组转换为字符串的数组。
当我理解您的问题时,我做了一些快速的尝试来帮助您,代码可以得到改进,而且必须如此,我说我做得很快。
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,但这不是主题。 希望对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.