iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

C# 和 SQL 探索之路系列 第 12

Day 12: C# 用 LINQ 操作 DataTable

  • 分享至 

  • xImage
  •  

嗨,今天接續昨天 LINQ 的內容,介紹如何操作資料表 (DataTable),篩選出需要的資料。
會使用到的方法如下:

  1. DataTable.AsEnumerable(): 將資料表轉為 IEnumerable<DataRow>,以便用 LINQ 查詢。
  2. DataRow.Field<string>("City"): 以強型別取得資料列的值。
  3. where 語法: 用條件篩選需要的資料,這裡可以混用 C# 本身的語法。
  4. select 語法: 取得結果,可以選擇取得其中一個欄位或整個資料列。
    4-1. 因為此處取得強型別資料 select r.Field<int>("ID") ,因此 result 會自動轉換為 int 的集合。
    4-2. 如果是 select r,則會輸出 DataRow 型別。
class Program
{
    // 先建立資料表結構與測試資料
    static DataTable GetTable(){
         DataTable table = new DataTable();

         table.Columns.Add("ID", typeof(int));
         table.Columns.Add("Name", typeof(string));
         table.Columns.Add("BirthYear", typeof(int));
         table.Columns.Add("City", typeof(string));

         table.Rows.Add(1, "Ming", 1990, "Taipei");
         table.Rows.Add(2, "Alice", 1991, "Taichung");
         table.Rows.Add(3, "Belly", 1992, "Kaohsiung");
         table.Rows.Add(4, "Peter", 1993, "Taipei");
         return table;
     }
    
    static void Main(string[] args)
    {
        DataTable table = GetTable();
        // 取得資料表中 City 欄位以 Tai 開始的資料列 ID
        // 使用 ?? 避免 null
        var result = from r in table.AsEnumerable()
                     where (r.Field<string>("City")?? string.Empty).StartsWith("Tai") 
                     select r.Field<int>("ID");
        foreach(var r in result){
            Console.WriteLine(r);
        }             
    }
}

程式碼範例

另外補充 ~
從 LINQ 的查詢結果取得第一筆資料,使用 .First().FirstOrDefault() 時,如果沒有資料,會拋出例外。此外,也要避免重複呼叫 .First().Count() 方法,避免不斷進行查詢導致影響效能。

參考資料


上一篇
Day 11: C# LINQ 介紹
下一篇
Day 13: C# Lambda 語法介紹
系列文
C# 和 SQL 探索之路30
圖片
  直播研討會

尚未有邦友留言

立即登入留言