Friday, January 28, 2011

[C#] LINQ to SQL 新手教學

LINQ是早在2007年就已推出的技術,一直到最近我才開始接觸,以下是開始碰LINQ順手的紀錄,提供給也想接觸LINQ一點參考。

LINQ to SQL Data Model

我新開了一個專案作為Demo,LINQ需要先建一個Data Model才能用,所以要先Add a new Item。

LINQ_DEMO_01


選擇LINQ to SQL Classes,這樣就會生出一個dbml檔。

LINQ_DEMO_02


不過新的dbml還沒有設定,所以都是空的,這時候在Server Explorer的[Data Connections]上選擇[Add Connection]。

LINQ_DEMO_03


輸入DB連線的相關資訊後就好了,也可以先按左下角的[Test Connection]測試一下是否有設對。

LINQ_DEMO_04


btw,我測試用的DB內容是長這樣

LINQ_DEMO_00


Query Example

然後來做幾個測試。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_Demo_1
{
    class Program
    {
        static void Main(string[] args)
        {
            LINQDemoDataContext DB = new LINQDemoDataContext();

            //讀取表格
            Console.WriteLine("讀取表格");
            var Result = from p in DB.tbl_users select p;
            Console.WriteLine("uid\tname\tage");
            foreach (var item in Result)
            {
                Console.WriteLine(item.uid + "\t" + item.name + "\t" + item.agr);
            }

            //讀取指定資料
            Console.WriteLine("讀取指定資料 #1");
            var selectone = from p in DB.tbl_users where p.uid == 3 select p.name;
            foreach (var item in selectone)
            {
                Console.WriteLine("uid 3 user name is " + item);
            }

            //another way
            Console.WriteLine("讀取指定資料 #2");
            tbl_user t_user = DB.tbl_users.Single(p => p.uid == 3);
            Console.WriteLine("uid 3 user name is "+t_user.name);

            Console.ReadLine();

        }
    }
}

這邊我做了select的兩個範例,第一個是將整個tbl_users表格資料列出,第二個是以兩種不同的方式將uid=3的user name 印出,應該還蠻容易懂的。


LINQ_DEMO_07
結果出來就是這樣。


Update Example

然後來測一下更新的語法。

LINQDemoDataContext DB = new LINQDemoDataContext();

            //原始資料
            Console.WriteLine("讀取 uid=1 資料");
            tbl_user user = DB.tbl_users.Single(p => p.uid == 1);
            Console.WriteLine(String.Format("uid 3 user name is {0}, age {1}",user.name,user.agr));

            //更新資料
            Console.WriteLine("更新資料");
            user.agr = 31;
            user.name = "Adom";

            DB.SubmitChanges();

            //更新後資料
            Console.WriteLine("更新後 uid=1 資料");
            Console.WriteLine(String.Format("uid 3 user name is {0}, age {1}", user.name, user.agr));

在這邊我使用SubmitChanges()這個function更新了tbl_user這個資料表裡uid=1的name與age,最後我是懶惰沒有重新讀取一次更新後的資料XD

結果如下。

LINQ_DEMO_08


Add New Data

接下來是新增資料的語法。

LINQDemoDataContext DB = new LINQDemoDataContext();

            //新增User
            Console.WriteLine("新增User");
            tbl_user user = new tbl_user();

            user.name = "James";
            user.agr = 47;
            DB.tbl_users.InsertOnSubmit(user);
            DB.SubmitChanges();

            //新增info
            Console.WriteLine("新增info");
            tbl_info info = new tbl_info();

            info.manager = null;
            info.score = 80;
            info.@class = "James May"; //@ ->因為保留字
            info.uid = user.uid; //same as @@identify
            DB.tbl_infos.InsertOnSubmit(info);
            DB.SubmitChanges();

            //新增後資料
            Console.WriteLine("新增之資料");
            tbl_user new_user = DB.tbl_users.Single(p => p.uid == user.uid);
            Console.WriteLine(String.Format("new user uid={0} ,name is {1}, age {2}", new_user.uid, new_user.name, new_user.agr));
            tbl_info new_info = DB.tbl_infos.Single(p => p.uid == user.uid);
            Console.WriteLine(String.Format("new user uid={0} ,class is {1}, manager is {2}, score = {3}", new_info.uid, new_info.@class,new_info.manager, new_info.score));

這邊先在tbl_user新增一筆資料,然後根據新增資料之uid再新增至tbl_info。


LINQ_DEMO_09

結果如上,LINQ取@@identify還蠻方便的。



Delete Example

接下來是刪除的範例。

            LINQDemoDataContext DB = new LINQDemoDataContext();

            //讀取表格
            Console.WriteLine("讀取表格");
            var Result = from p in DB.tbl_users select p;
            Console.WriteLine("uid\tname\tage");
            foreach (var item in Result)
            {
                Console.WriteLine(item.uid + "\t" + item.name + "\t" + item.agr);
            }

            //刪除name為Tuan之資料
            Console.WriteLine("刪除資料");
            var DelItem = from p in DB.tbl_users where p.name.Contains("Tuan") select p;
            DB.tbl_users.DeleteAllOnSubmit(DelItem);
            DB.SubmitChanges();

            //讀取表格
            Console.WriteLine("刪除後之結果");
            Result = from p in DB.tbl_users select p;
            Console.WriteLine("uid\tname\tage");
            foreach (var item in Result)
            {
                Console.WriteLine(item.uid + "\t" + item.name + "\t" + item.agr);
            }
                          
            Console.ReadLine();

這邊刪除了tbl_user裡name為"Tuan"的資料列,結果如下。


LINQ_DEMO_10


Call Stored Procedure

接下來介紹如何呼叫預存程序,我先弄個會隨機選取一列的Stored Procedure。


CREATE PROCEDURE sp_RandomRow
AS
BEGIN
 SET NOCOUNT ON;
 SELECT TOP 1 [uid],[name],[agr] FROM tbl_user ORDER BY NEWID()
END
GO

然後將這個預存程序拉進dbml內,這樣在程式中才能呼叫,下面是呼叫預存程序的語法。


            LINQDemoDataContext DB = new LINQDemoDataContext();

            //呼叫預存程序
            Console.WriteLine("呼叫預存程序");
            var Result = DB.sp_RandomRow();
            Console.WriteLine("uid\tname\tage");
            foreach (var item in Result)
            {
                Console.WriteLine(item.uid + "\t" + item.name + "\t" + item.agr);
            }

執行結果沒啥特別,我就懶得貼了。

以上為LINQ TO SQL的基本教學,基本上會用到的需求都有作範例了,希望對於上手有幫助。

No comments:

Post a Comment