可以用來查詢 Local 資料,
我覺得還蠻簡單的,
不用像 Filter 還要組 SQL 的字串,
方法如下:
- 首先我們宣告一個 DataTable 的變數,用來暫存一份資料複本。
- 然後在 DoLocalQuery() 中,第一次執行的時候把 localCache 建立起來,並且複製一份複本。
- 然後每次在查詢前從 localCache 複製一份到 dt 去。
- var query = dt.AsEnumerable(); <= 把 dt 轉換成 query。
- 再來就是判斷value1有值的話就去查詢,然後塞回query去。
- 然後就重複下去,看有幾個變數要查,其實這段可以變成一個函式。
- 查完之後用 query.CopyToDataTable() 轉成 DataTable。
- 最後把 dt 塞回去給 BindingSource 就完成啦!
DataTable localCache;
private void DoLocalQuery()
{
string value1 = leQueryColumn1.Text.ToString();
string value2 = leQueryColumn2.Text.ToString();
string value3 = leQueryColumn3.Text.ToString();
if (localCache == null)
{
localCache = new DataTable();
localCache = MainTable.Copy();
}
DataTable dt = localCache.Copy();
var query = dt.AsEnumerable();
if (!string.IsNullOrEmpty(value1))
query = query.Where(r => r.Field<string>("column1") == value1);
if (!string.IsNullOrEmpty(value2))
query = query.Where(r => r.Field<string>("column2") == value2);
if (!string.IsNullOrEmpty(value3))
query = query.Where(r => r.Field<string>("column3") == value3);
if (query.Count() > 0)
{
dt = query.CopyToDataTable();
}
else
{
dt.Clear();
}
//將 dt 塞回去給 BindingSource 去。
}
我覺得這樣寫查詢還蠻簡單易懂的,
要說缺點嘛,大概就是要作一份 localCache ,
大概就是這樣吧!
沒有留言:
張貼留言