LINQ 與資料存取 (2) - 透過 LINQ 讀取 DataSet 資料

在「LINQ 與資料存取 (1) -從 ADO.NET 開始」這篇文章中,示範了最簡單的DataSet資料讀取,現在進一步的,利用另LINQ萃取出其中的內容,現在根據相同的資料來源 KTMS 資料表,建立一個新的主控台應用程式,並撰寫以下的程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace LINQ_to_DataSet
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection(
                @"Server=TIM-PC;DataBase = KTMS ;Trusted_Connection=True ; ");
            string sql = "SELECT * FROM Categories";
            DataSet ds = new DataSet();
            using (conn)
            {
                SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
                adapter.Fill(ds, "Categories");
            }
            EnumerableRowCollection<DataRow> table =
ds.Tables[0].AsEnumerable() ;
            IEnumerable<DataRow> rows = from row in table
                                        select row;
            foreach (DataRow row in rows)
            {
                Console.WriteLine(row[0].ToString() + ""+row[1]);
            }
            Console.ReadKey();           
        }
    }
}

DataRow 型態,儲存於 table 變數,然後便是套用 LINQ 搜尋語法,搜尋其中的資料內容,並且逐一取出第一個以及第二個欄位的內容顯示在畫面上。以下為執行結果:

101001PC 組裝元件大類(A
101002PC 週邊設備(B
101003PC 延伸裝置(C

如你所見,DataTable透過AsEnumerable 方法轉換回傳IEnumerable 物件,一種以 DataRow 為其泛型型別參數 T 的 EnumerableRowCollection<datarow> 物件,轉換完成之後就可以將標準的 LINQ搜尋運算,運用在相關的搜尋上面。

除了回傳 Categories 資料表的所有內容,無論是透過索引或是欄位名稱,都可以直接取得其中的特定欄位內容,以下是另外一段程式碼:

EnumerableRowCollection<DataRow> table =
ds.Tables["Categories"].AsEnumerable();
var rows = from row in table
             select new
             {
                 categoryID = row["CategoryID"].ToString(),
                 categoryName = row["CategoryName"].ToString()
             };
foreach (var row in rows)
{
Console.WriteLine(row.categoryID+""+row.categoryName);
}

其中透過欄位名稱取得特定欄位的內容,包含 CategoryID 與 CategoryName 等, select 敘述萃取此兩組欄位的內容,並建立對應的物件屬性 categoryID 與 categoryName ,接下來的迴圈則直接引用屬性名稱,逐一將欄位內容取出。


沒有留言: