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 ……. 當然還有微軟的幫助