LINQ to SQL Data Model
我新開了一個專案作為Demo,LINQ需要先建一個Data Model才能用,所以要先Add a new Item。
選擇LINQ to SQL Classes,這樣就會生出一個dbml檔。
不過新的dbml還沒有設定,所以都是空的,這時候在Server Explorer的[Data Connections]上選擇[Add Connection]。
輸入DB連線的相關資訊後就好了,也可以先按左下角的[Test Connection]測試一下是否有設對。
btw,我測試用的DB內容是長這樣
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 印出,應該還蠻容易懂的。
結果出來就是這樣。
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
結果如下。
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取@@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"的資料列,結果如下。
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