2008年6月26日 星期四

Language Integrated Query (LINQ)

Language Integrated Query (LINQ)

整合性查詢語言

美國微軟副總Somasegar

LINQ消除不同資料領域不協調阻力的突破性科技,例如在查詢XML、關連式資料庫或物件時,透過LINQ技術,程式開發人員不需要學習個別不同的查詢語法;另外一般SQL必須在執行完成後才可以檢查出錯誤 ,LINQ在編譯過程中即可檢查錯誤

一、

、以C#示範新增、刪除、修改、查詢

查詢:

SQL語法:

Select Supplier_name,Supplier_product,SupplierInfo_phone1

from Supplier

join SupplierInfo on Supplier_name = SupplierInfo_name

where Supplier_name = ‘閔碩電腦’ Order by Supplier_id

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext(); //LinQ to SQL類別

var bcshahuo = from b in ddb.Supplier

join o in ddb.SupplierInfo      //join Table

on b.Supplier_name equals o.SupplierInfo_name //join 條件

where b.Supplier_name == "閔碩電腦" //where 條件

select new { b.Supplier_name, b.Supplier_product,o.SupplierInfo_phone1};//欄位

ps:var 為C#3.0後才有的關鍵字,需初始化,亦可根據後面的判斷句自動判斷產生該類型,但初始化後只能儲存該類型

新増:

SQL語法:

Insert into SupplierInfo (SupplierInfo_name, SupplierInfo_human) values (test, test)

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext();

SupplierInfo s1 = new SupplierInfo

{

SupplierInfo_id = new int(),

SupplierInfo_name = "test",

SupplierInfo_human = "test"

};

ddb.SupplierInfo.InsertOnSubmit(s1);//InsertOnSubmit來包住命令

ddb.SubmitChanges(); //DataContext的方法,執行適當的命令來實作資料庫的變更

ps. DataContext類別, 表示 LINQ to SQL 架構的主要進入點

刪除:

SQL語法:

delete SupplierInfo where SupplierInfo_id = (select top 1 SupplierInfo_id from SupplierInfo where SupplierInfo_name like 'test%')

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext();

SupplierInfo supplierinfo = ddb.SupplierInfo.First(b => b.SupplierInfo_name.StartsWith("test"));

ddb.SupplierInfo.DeleteOnSubmit(supplierinfo); //DeleteOnSubmit來包住命令

ddb.SubmitChanges();

修改:

SQL語法:

Update supplierinfo set SupplierInfo_human= Hana where SupplierInfo_id = (select top 1 SupplierInfo_id from SupplierInfo where SupplierInfo_name like 'test %')

LINQ語法:

bcshahuoDataContext ddb = new bcshahuoDataContext();

SupplierInfo supplierinfo = ddb.SupplierInfo.First(b => b.SupplierInfo_name.StartsWith("test"));

supplierinfo.SupplierInfo_human = "Hana";

ddb.SubmitChanges();// 這裡就不用再包住命令 直接執行

LinQ To SQL其他說明

1. 動態的Linq to Sql說明----看操作

2. LinQ在對sql做指令動作時,限制有點過於嚴謹,比如連結的資料表沒有PKEY的話,是會發生錯誤的

3. 在對SQL欄位動作時,SQL資料型態跟LINQ的資料型態轉換上也是的嚴謹,因此要對應下面這張圖來設定他的資料型態

SQL Data Type

Linq to SQL .NET Data Type

tinyint

System.Nullable<byte>

smallint

System.Nullable<short>

int

System.Nullable<int>

bigint

System.Nullable<long>

float

System.Nullable<double>

real

System.Nullable<float>

smallmoney

System.Nullable<decimal>

money

System.Nullable<decimal>

numeric(6, 2)

System.Nullable<decimal>

numeric(12, 2)

System.Nullable<decimal>

numeric(18, 2)

System.Nullable<decimal>

xml

System.Xml.Linq.XElement

image

System.Data.Linq.Binary

binary, varbinary

System.Data.Linq.Binary

bit

System.Nullable<bool>

datetime

System.Nullable<system.datetime>

timestamp

System.Data.Linq.Binary

uniqueidentifier

System.Nullable<system.guid>

varchar, char, text, ntext

System.String

<資料來源>

四、LINQ to 物件

運算處理後的結果

string[] numbers = TextBox1.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in numbers

select Convert.ToInt32(n)+1;

//SQL寫法

select Convert(int,n)+1

from numbers

where條件

string[] numbers = TextBox1.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in numbers

where Convert.ToInt32(n) > 5

select Convert.ToInt32(n);

//SQL 寫法

select n

from numbers

where Convert.ToInt32(n) > 5

排序

string[] numbers = TextBox1.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in numbers

orderby Convert.ToInt32(n) descending

select Convert.ToInt32(n);

//SQL 寫法

select n

from numbers

order by Convert.ToInt32(n) desc

Group By

string[] strings = TextBox2.Text.Split(',');

//LINQ 寫法

var strLinQ =

from n in strings

//orderby n

group n by n.Substring(0, 1) into Groups

select Groups ;

String Intoutput = "";

foreach(var Groups in strLinQ)

{

Intoutput += "開始字母為:" + Groups.Key+"<br>";

foreach (string i in Groups)

{

Intoutput += i + ",";

}

Intoutput += "<br>";

}

Label4.Text = Intoutput;

//SQL寫法

select substring(n,1,1) as bb, case when aa like '%'+substring(n,1,1)+'%'

then aa end as aa

from strings

Distinct

//LINQ寫法

var strLinQ =

from n in numbers.Distinct()

select Convert.ToInt32(n);

var strLinQ = numbers.Distinct();

//SQL寫法

select distinct * from numbers

n

//LINQ寫法

var strLinQ = strings.Take(n);

//SQL寫法

select Top n * from strings

忽略前n

//LINQ寫法

var strLinQ = strings.Skip(n);

彙總函數

//LINQ寫法

var strLinQ = numbers.Count();

var strLinQ = numbers.Sum();

var strLinQ = numbers.Min();

var strLinQ = numbers.Max();

var strLinQ = numbers.Average();

、參考資料

1. LINQ學習手冊..蔡學鏞譯 碁峰出版 ………已經是公司資產了,大家好好利用他好嗎

2. http://blog.miniasp.com/ ………這個人也很勵害,但他的文章大部份來算對以下二個來源的學習

3. http://weblogs.asp.net/scottgu/default.aspx ………微軟.net部門總經理Scott Guthrie的部落格..勵害的傢伙

4. http://www.asp.net/learn/linq-videos/    …….直接可以下載demo的影片,很詳細大家看看

5. 線上MSDN             ……. 當然還有微軟的幫助