C# LINQ語法與SQL語法

 


LINQ語法其實跟SQL語法還蠻像的,說蠻像基本上就是拿SQL語法來程式內使用而已。 學習過SQL的人太概都知道SQL的好處,雖說不上萬能,但是在找尋資料時卻是很好用的一種語法。
很多時候,不靠SQL資料庫要處理龐大內存資料真是一種痛苦,由其是不靠資料庫處理大量檔案資料或是內存資料時就是如此。如果有兩種資料須要JOIN就會需要很多程式碼,很多for/foreach迴圈去跑,因此總會希望程式碼在處理內存資料時會有像SQL這樣簡單的語法可以使用。
當然很多地方大都有在說LINQ和SQL的詳細寫法,我這邊也不再描述,我這邊主要是讓大家看看這兩種語法相似之處。

假如我有兩個資料表 學生基本資料(Student) 和 學等(Grade):
Student
StudentIDNameGenderAddressCityAddressArea
A0001吳山汝Female台北市萬華區
A0045卓凱耀Male台中市北區
A0107劉立沛Male高雄市鼓山區

Grade
StudentIDClassScore
A00011.4550
A00452.5490
A01073.1581

我們看看 幾個比較 假如我要選取學生資料表(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();


輸出結果:
卓凱耀Male490




留言

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

統一發票列印小程式

C# 使用 Process.Start 執行外部程式