04 LINQ簡介 - wycmaker/MVC-learning GitHub Wiki
LINQ(Language Integrated Query),中文為語言集成查詢,在還沒有LINQ之前,我們讀取資料必須自行撰寫XML、SQL等查詢,但C#無法辨識這些語法,所以在除錯上必須由程式設計人員自行手動除錯;有了LINQ之後,除了可以使用Visual Studio提供的語法提示,也可以在撰寫程式時,同步對錯誤的語法進行偵錯,減少尋找錯誤的時間。
基本語法:
var 查詢變數 = from 範圍變數 in 資料來源
select 序列元素;
範例一: 查詢後的資料
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6 }; //資料來源
var query = from num in numbers // num 為範圍變數
select num+1; // num+1 為實際取得的元素值
foreach(int num in query) // 延後查詢:
{ // LinQ的查詢建立之後,不會立即執行,而是在foreach迴圈開始時,才進行查詢
Console.WriteLine(num);
}
執行結果:
2
3
4
5
6
7
從執行結果可以看出,查詢出來的元素為Select後的元素,也就是num+1,而不是list中元素原本的值。
範例二: 自己定義取出的資料
List<string> country = new List<string>() { "Taiwan", "Japan", "China" };
var CountryQuery = from coun in country
select new { Upper = coun.ToUpper() };
foreach (var coun in CountryQuery)
{
Console.WriteLine(coun.Upper);
}
執行結果:
TAIWAN
JAPAN
CHINA
在Select後的序列元素也可以透過new的方式自己定義,上面的範例就是定義了Upper欄位,在執行時,用coun.Upper,就可以列出相對應的資料。
範例三: 將取出的資料作為list的索引值
List<int> indexs = new List<int>() { 0, 1, 2, 3, 4 };
List<string> digits = new List<string>() { "One", "Two", "Three", "Four", "Five" };
var IndexQuery = from index in indexs
select digits[index];
foreach (var index in IndexQuery)
{
Console.WriteLine("Number=" + index);
}
執行結果:
Number=One
Number=Two
Number=Three
Number=Four
Number=Five
上面的範例可以看到,我們從indexs中查詢資料,並將查詢的結果當作digits的索引值,最後輸出成我們要的資料。
基本語法:
var 查詢變數 = from 範圍變數 in 資料來源
where 條件子句
select 序列元素;
範例四: 取得特定條件資料
List<int> scores = new List<int>() { 67, 75, 85, 90, 70, 56 };
var ScoreQuery = from score in scores
where score > 70
select score;
foreach (var score in ScoreQuery)
{
Console.WriteLine("分數:" + score);
}
執行結果:
分數:75
分數:85
分數:90
範例五: 兩個條件的查詢
List<int> MathScore = new List<int>() { 54, 60, 75, 94, 45, 68, 82 };
var MathQuery = from mathscore in MathScore
where mathscore >= 60 //where mathscore >= 60 && mathscore <= 90
where mathscore <= 90
select mathscore;
foreach (var mathscore in MathQuery)
{
Console.WriteLine("分數:" + mathscore);
}
執行結果:
分數:60
分數:75
分數:68
分數:82
對於有多個條件的查詢,一種方法是用多個where進行條件的敘述,另一種方法是使用&&
與||
兩個運算子。
基本語法:
var 查詢變數 = from 範圍變數 in 資料來源
where 條件子句
order 排序的欄位 ascending(descending)
select 序列元素;
範例六: 正序排列
List<int> EnglishScore = new List<int>() { 82, 89, 75, 67, 95, 84, 99 };
var EnglishQuery = from englishscore in EnglishScore
where englishscore > 70
orderby englishscore ascending
select englishscore;
Console.WriteLine("從小到大:");
foreach (var englishscore in EnglishQuery)
{
Console.Write(englishscore + " ");
}
執行結果:
從小到大:
75 82 84 89 95 99
範例七:反序排列
List<int> ChineseScore = new List<int>() { 82, 89, 75, 67, 95, 84, 99 };
var ChineseQuery = from chinesescore in ChineseScore
where chinesescore > 70
orderby chinesescore descending
select chinesescore;
Console.WriteLine("從大到小:");
foreach (var chinesescore in ChineseQuery)
{
Console.Write(chinesescore + " ");
}
執行結果:
從大到小:
99 95 89 84 82 75
基本語法:
var 查詢變數 = from 範圍變數 in 資料來源
group 範圍變數 by 分組條件;
範例八:將資料分組
List<string> Names = new List<string>() { "Jack", "Merry", "Allen", "Jason", "Alice" };
var NameQuery = from name in Names
group name by name.Substring(0, 1);
foreach (var namegroup in NameQuery)
{
Console.WriteLine(namegroup.Key);
foreach (var name in namegroup)
{
Console.WriteLine("名字:" + name);
}
}
執行結果:
J
名字:Jack
名字:Jason
M
名字:Merry
A
名字:Allen
名字:Alice
使用gruop進行查詢時,因為會將資料進行分組,所以需要用兩層迴圈,第一層迴圈為分組的組名,namegroup.Key
是用來取得組名的,第二層迴圈則是各個分組的資料。
下列是由各個範例的LINQ查詢語法,轉換成Lambda形式的查詢語法。
範例一:
//LINQ查詢:
var query = from num in numbers
select num + 1;
// Lambda:
var query = numbers.Select(num => num + 1);
範例二:
//LINQ查詢:
var CountryQuery = from coun in country
select new { Upper = coun.ToUpper() };
// Lambda:
var CountryQuery = country.Select(coun => new { Upper = coun.ToUpper() });
範例三:
//LINQ查詢:
var IndexQuery = from index in indexs
select digits[index];
// Lambda:
var IndexQuery = indexs.Select(index => digits[index]);
範例四:
//LINQ查詢:
var ScoreQuery = from score in scores
where score > 70
select score;
// Lambda:
var ScoreQuery = scores.Where(score => score > 70);
範例五:
//LINQ查詢:
var MathQuery = from mathscore in MathScore
where mathscore >= 60 && mathscore <= 90
select mathscore;
// Lambda:
var MathQuery = MathScore.Where(mathscore => mathscore >= 60 && mathscore <= 90);
範例六:
//LINQ查詢:
var EnglishQuery = from englishscore in EnglishScore
where englishscore > 70
orderby englishscore ascending
select englishscore;
// Lambda:
var EnglishQuery = EnglishScore.OrderBy(englishscore => englishscore)
.Where(englishscore => englishscore > 70);
範例七:
//LINQ查詢:
var ChineseQuery = from chinesescore in ChineseScore
where chinesescore > 70
orderby chinesescore descending
select chinesescore;
// Lambda:
var ChineseQuery = ChineseScore.OrderByDescending(chinesescore => chinesescore)
.Where(chinesescore => chinesescore > 70);
範例八:
//LINQ查詢:
var NameQuery = from name in Names
group name by name.Substring(0, 1);
// Lambda:
var NameQuery = Names.GroupBy(name => name.Substring(0, 1));
LINQ入門、簡介、初試身手: https://dotblogs.com.tw/mis2000lab/archive/2014/09/03/learning_linq_1_20140903.aspx
所以什麼是LINQ?: https://ithelp.ithome.com.tw/articles/10194251
LINQ中的Lambda表達式:https://jimmy0222.pixnet.net/blog/post/36945039