2011年7月22日 星期五

C# Linq 查詢 Local 資料的方法

這邊要介紹一個我覺得還不錯的 Linq 的寫法,
可以用來查詢 Local 資料,
我覺得還蠻簡單的,
不用像 Filter 還要組 SQL 的字串,
方法如下:
  1. 首先我們宣告一個 DataTable 的變數,用來暫存一份資料複本。
  2. 然後在 DoLocalQuery() 中,第一次執行的時候把 localCache 建立起來,並且複製一份複本。
  3. 然後每次在查詢前從 localCache 複製一份到 dt 去。
  4. var query = dt.AsEnumerable(); <= 把 dt 轉換成 query。
  5. 再來就是判斷value1有值的話就去查詢,然後塞回query去。
  6. 然後就重複下去,看有幾個變數要查,其實這段可以變成一個函式。
  7. 查完之後用 query.CopyToDataTable() 轉成 DataTable。
  8. 最後把 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 ,
大概就是這樣吧!

沒有留言:

張貼留言