我使用強類型數據集,並有許多表..如何從數據表中獲得不同的值在強類型數據集
的問題是,現在我想從
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