C# LINQ語法與SQL語法
LINQ語法其實跟SQL語法還蠻像的,說蠻像基本上就是拿SQL語法來程式內使用而已。 學習過SQL的人太概都知道SQL的好處,雖說不上萬能,但是在找尋資料時卻是很好用的一種語法。
很多時候,不靠SQL資料庫要處理龐大內存資料真是一種痛苦,由其是不靠資料庫處理大量檔案資料或是內存資料時就是如此。如果有兩種資料須要JOIN就會需要很多程式碼,很多for/foreach迴圈去跑,因此總會希望程式碼在處理內存資料時會有像SQL這樣簡單的語法可以使用。
當然很多地方大都有在說LINQ和SQL的詳細寫法,我這邊也不再描述,我這邊主要是讓大家看看這兩種語法相似之處。
假如我有兩個資料表 學生基本資料(Student) 和 學等(Grade):
Student | ||||
---|---|---|---|---|
StudentID | Name | Gender | AddressCity | AddressArea |
A0001 | 吳山汝 | Female | 台北市 | 萬華區 |
A0045 | 卓凱耀 | Male | 台中市 | 北區 |
A0107 | 劉立沛 | Male | 高雄市 | 鼓山區 |
Grade | ||
---|---|---|
StudentID | Class | Score |
A0001 | 1.4 | 550 |
A0045 | 2.5 | 490 |
A0107 | 3.1 | 581 |
我們看看 幾個比較 假如我要選取學生資料表(Student)裏面的姓名(Name),然後過濾條件是住在台中市(AddressCity)會怎麼做呢?
SQL語法:
Select a.Name
From Student a
Where a.AddressCity = '台中市'
這三行分別就是:
選擇輸出的資料欄(Select)
資料來源(From)
過濾條件(Where)
注意:
SQL對指令沒有大小寫分別,對字串不是使用雙引號,而是單引號
其中那個 a 是『別名』
如果用LINQ來寫,就會像如下:
var result = ( from a in Student
where a.AddressCity == "台中市"
select a.Name
).FirstOrDefault();
可以看得出來他的順序是:
資料來源(from)
過濾條件(where)
選擇輸出的欄位(select)
此時輸出result型別通常是Name這個欄位型別(string,int,bool......)
輸出結果:
卓凱耀
注意:LINQ 的 select/from/where 都一定是小寫,比較運算子也是依照C語言的方式(==)
字串一定使用雙引號(C語言標準)
<===================>
如果想要輸出『所有欄位』寫法:
SQL語法:
Select *
From Student a
Where a.AddressCity = '台中市'
LINQ語法:
var result = (from a in Student
where a.AddressCity == "台中市"
select a
).FirstOrDefault();
此時輸出result通常是物件型別IQueryable,可能是Array、List<>或其他
輸出結果:
A0045 | 卓凱耀 | Male | 台中市 | 北區 |
<===================>
如果想要輸出『指定欄位』寫法,例如要輸出姓名(Name)和性別(Gender):
SQL語法:
Select a.Name,a.Gender
From Student a
Where a.AddressCity = '台中市'
LINQ語法:
var result = (from a in Student
where a.AddressCity == "台中市"
select new {a.Name , a.Gender}
).FirstOrDefault();
此時result輸出通常為 IQueryable型別。
輸出結果:
卓凱耀 | Male |
<===================>
如果要家入第2個表 成績(Grade)來進行查詢,該怎麼做呢?
通常這兩個表要有關聯的欄位,例如這兩個表都有 學號(StudentID),就可以如下關聯找出對等資料 SQL語法:
Select a.Name,a.Gender,b.Score
From Student a , Grade b
Where a.StudentID = b.StudentID
and a.AddressCity = '台中市'
LINQ語法:
var result = (from a in Student
join b in Grade on a.StudentID == b.StudentID
where a.AddressCity == "台中市"
select new {a.Name , a.Gender , b.Score}
).FirstOrDefault();
輸出結果:
卓凱耀 | Male | 490 |
留言