嗨,今天接續昨天 LINQ 的內容,介紹如何操作資料表 (DataTable),篩選出需要的資料。
會使用到的方法如下:
DataTable.AsEnumerable()
: 將資料表轉為 IEnumerable<DataRow>
,以便用 LINQ 查詢。DataRow.Field<string>("City")
: 以強型別取得資料列的值。where
語法: 用條件篩選需要的資料,這裡可以混用 C# 本身的語法。select
語法: 取得結果,可以選擇取得其中一個欄位或整個資料列。select r.Field<int>("ID")
,因此 result
會自動轉換為 int
的集合。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()
方法,避免不斷進行查詢導致影響效能。