04 LINQ簡介 - wycmaker/MVC-learning GitHub Wiki

介紹

LINQ(Language Integrated Query),中文為語言集成查詢,在還沒有LINQ之前,我們讀取資料必須自行撰寫XML、SQL等查詢,但C#無法辨識這些語法,所以在除錯上必須由程式設計人員自行手動除錯;有了LINQ之後,除了可以使用Visual Studio提供的語法提示,也可以在撰寫程式時,同步對錯誤的語法進行偵錯,減少尋找錯誤的時間。

簡易入門

Select

基本語法:

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的索引值,最後輸出成我們要的資料。

Where條件式查詢

基本語法:

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進行條件的敘述,另一種方法是使用&&||兩個運算子。

Order排序

基本語法:

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

Group群組化

基本語法:

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 to Lambda

下列是由各個範例的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

⚠️ **GitHub.com Fallback** ⚠️