LINQ學習:Select的用法


轉載於:http://www.cnblogs.com/ForEvErNoME/archive/2012/07/25/2606659.html

說明:在查詢表達式中,select 子句可以指定將在執行查詢時產生的值的類型。 該子句的結果將基於前面所有子句的計算結果以及 select 子句本身中的所有表達式。 查詢表達式必須以 select 子句或 group 子句結束。

 

Select操作包括7種形式,分別為簡單用法、匿名類型形式、條件形式、篩選形式、嵌套類型形式、本地方法調用形式、Distinct形式。下面分別用實例舉例下:

復制代碼
            class Student
            {
               public string Name { get; set; }
               public int Score { get; set; }
            }
            List<Student> students = new List<Student>{
               new Student {Name="Terry", Score=50},
               new Student {Name="AI", Score=80},
               new Student {Name="AI", Score=70},
            };
復制代碼

 

1.簡單用法

說明:當以select結尾時表示的只是一個聲明或者一個描述,並沒有真正把數據取出來,只有當你需要該數據的時候,它才會執行這個語句,這就是延遲加載(deferred loading)。

查詢學生的姓名:

復制代碼
            var query = from student in students
                        select student.Name;
            foreach (var student in query)
            {
                Console.WriteLine("{0}", student);
                //Terry
                //AI
                //AI
            }
復制代碼

 

2.匿名類型形式

說明:其實質是編譯器根據我們自定義產生一個匿名的類來幫助我們實現臨時變量的儲存。例如 var ob = new {Name = "Harry"},編譯器自動產生一個有property叫做Name的匿名類,然后按這個類型分配內存,並初始化對象。

查詢學生的姓名:

復制代碼
            var query = from student in students
                        select new
                        {
                            newName = "學生姓名:" + student.Name
                        };
            foreach (var student in query)
            {
                Console.WriteLine(student.newName);
                //學生姓名:Terry
                //學生姓名:AI
                //學生姓名:AI
            }
復制代碼

 

3.條件形式

說明:三元運算,類似於SQL語句case when condition then else的用法。

查詢學生的分數等級:

復制代碼
            var query = from student in students
                        select new
                        {
                            student.Name,
                            level = student.Score < 60 ? "不及格" : "合格"
                        };
            foreach (var student in query)
            {
                Console.WriteLine("{0}:{1}", student.Name, student.level);
                //Terry:不及格
                //AI:及格
                //AI:及格
            }
復制代碼

 

4.篩選形式

說明:結合where用起到過濾的作用。

查詢Terry的分數:

復制代碼
            var query = from student in students
                        where student.Name == "Terry"
                        select student;
            foreach (var student in query)
            {
                Console.WriteLine("{0}:{1}",student.Name,student.Score);
                //Terry:50
            }
復制代碼

 

5.嵌套類型形式

說明:如果一個數據源里面又包含了一個或多個集合列表,那么應該使用復合的select子句來進行查詢。

查詢大於80分的學生分數:

復制代碼
           class Student
           {
              public string Name { get; set; }
              public List<int> Scores { get; set; }
           }
            List<Student> students = new List<Student>{
               new Student {Name="Terry", Scores=new List<int> {97, 72, 81, 60}},
               new Student {Name="AI", Scores=new List<int> {75, 84, 91, 39}},
               new Student {Name="Wade", Scores=new List<int> {88, 94, 65, 85}},
               new Student {Name="Tracy", Scores=new List<int>{97, 89, 85, 82}},
               new Student {Name="Kobe", Scores=new List<int> {35, 72, 91, 70}} 
            };
            var query = from student in students
                        select new
                        {
                            student.Name,
                            //生成新的集合對象
                            highScore=from sc in student.Scores
                            where sc>80
                            select sc
                        };
            foreach (var student in query)
            {
                Console.Write("{0}:",student.Name);
                foreach (var scores in student.highScore)
                {
                    Console.Write("{0},",scores);
                }
                Console.WriteLine();
                //Terry:97,81,
                //AI:84,91,
                //Wade:88,94,85,
                //Tracy:97,89,85,82,
                //Kobe:91,
            }
復制代碼

 

6.本地方法調用形式

說明:調用自定義方法。

復制代碼
            var query = from student in students
                        select new
                        {
                            student.Name,
                            //調用GetLevel方法
                            level = GetLevel(student.Score)
                        };
            foreach (var student in query)
            {
                Console.WriteLine("{0}:{1}", student.Name, student.level);
                //Terry:不及格
                //AI:及格
                //AI:及格
            }

            protected static string GetLevel(int score)
            {
                if (score > 60)
                {
                   return "及格";
                }
                else
                {
                   return "不及格";
                }
             }
復制代碼

 

7.Distinct形式

說明:用於查詢不重復的結果集。類似於SQL語句SELECT DISTINCT 。

查詢不重復的學生姓名:

復制代碼
            var query = (from student in students
                         select student.Name).Distinct();
            foreach (var student in query)
            {
                Console.WriteLine("{0}", student);
                //Terry:
                //AI
            }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM