當 DataTable 資料尚未寫入資料庫、或已在本地修改未回寫時,無法使用 SQL 查詢。DataView 的 RowFilter 屬性提供類 SQL 的篩選語法,直接在記憶體中完成查詢、排序、編輯。
private DataTable MakeTable()
{
var dt = new DataTable("Products");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
dt.Rows.Add(1, "足球", 57.5m);
dt.Rows.Add(2, "籃球", 64.5m);
dt.Rows.Add(3, "網球", 6.5m);
dt.Rows.Add(4, "網球拍", 388.5m);
return dt;
}
DataTable dt = MakeTable();
Session["Table"] = dt;
DataGrid1.DataSource = dt;
DataGrid1.DataBind();
DataView dv = new DataView((DataTable)Session["Table"]);
dv.RowFilter = "Name LIKE '%" + TextBox1.Text.Trim() + "%'";
DataGrid1.DataSource = dv;
DataGrid1.DataBind();
輸入「網」→ 顯示「網球」、「網球拍」。
dv.RowFilter = "Price >= " + TextBox2.Text.Trim() +
" AND Price <= " + TextBox3.Text.Trim();
輸入 10 ~ 70 → 顯示「足球 57.5」、「籃球 64.5」。
| 類別 | 運算子/函數 | 範例 |
|---|---|---|
| 比較 | =, <>, <, >, <=, >= | Price <= 50 |
| IN | Category IN (1,2,3) | |
| LIKE | Name LIKE '%球%' | |
| IS NULL | Remark IS NULL | |
| 算術 | +, -, *, /, % | Price * 1.05 |
| 字串串接 | + | FirstName + ' ' + LastName |
| 邏輯 | AND, OR, NOT | (A=1 OR A=2) AND B>5 |
| 括號優先序 | (...) | |
| 通配元 | * 或 %(開頭/結尾) | LIKE 'abc*'、LIKE '*abc' |
| 聚合(需關聯) | Sum, Avg, Min, Max, Count, StDev, Var | Sum(Child.Price) |
| 父表參考 | Parent.ColumnName | Parent.CategoryName |
| 子表參考 | Child(關聯名).ColumnName | Avg(Child(Orders2Details).Qty) |
| 單表聚合 | Agg(ColumnName) | Sum(Price) |
'John'(單引號)#1/31/2024#(井號)50.00、1.2E3EnumColumn = 5(轉整數)RowFilter 不支援子查詢、JOIN、存儲程序等進階 SQL 功能。DataSet.CaseSensitive 或 DataTable.CaseSensitive 控制。DataTable.Select 或 LINQ to DataSet。DataView.RowFilter 是離線資料操作的利器,語法直覺、效能足夠中小型資料集,掌握它能大幅減少資料庫往返。