c# linq

LINQ(讀音link)表明語言集成查詢(Language Integrated Query),是.NEt框架的擴展,它容許咱們用SQL查詢數據庫的方式來查詢數據的集合,使用它,你能夠從數據庫、程序對象的集合以及XML文檔中查詢數據數據庫

 

Linq語法
let子句

let子句接受一個表達式的運算而且把它賦值給一個須要在其餘運算中使用的標識符,它是from...let...where片斷中的一部分框架

?
1
2
3
4
5
var query = from a in groupA
    from b in groupB
    let sum = a + b
    where sum < 12
    select new (a,b,sum);
 from子句  

from子句指定了要做爲數據源使用的數據集合,它的語法是:spa

?
1
from Type Item in Items

其中Type是集合中元素的類型,是可選的,由於編譯器能夠從集合來推斷類型。  Item是迭代變量的名字。  Items是要查詢的集合的名字,必須是可枚舉類型的.net

它和foreach比較類似,但foreach語句在遇到代碼時就執行其主體,二from子句什麼也不執行。它建立能夠執行的後臺代碼對象,只有在程序的控制流遇到訪問查詢變量的語句時纔會執行code

 join子句  

若是您對SQL中的join比較熟悉的話,那麼LINQ中的join對你來講也不是什麼難事,不熟悉的話,,當我沒說。htm

咱們可使用join來結合兩個或更多集合中的數據,它接受兩個集合而後建立一個臨時的對象集合對象

?
1
2
var query = from s in students
   join c in course on s.SID equals c.SID

equals用於比較相等性的字段,不能使用「==」代替,下面示例中有三個學生和三門課程,咱們要作的是查找選修了歷史課的學生名排序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace LINK查詢
{
  class Program
  {
  public class Student //聲明student類
  {
   public int stId; //學生ID
   public string stuName; //學生姓名
  }
 
  public class Course //聲明course類
  {
   public int stId; //學生ID
   public string courseName; //課程名
  }
 
  static Student[] students = new Student[]
  {
   new Student {stId = 1,stuName = "jack" },
   new Student {stId = 2,stuName = "taylor" },
   new Student {stId = 3,stuName = "fleming" }
  };
 
  static Course[] courses = new Course[]
  {
   new Course{stId = 1,courseName = "art" },
   new Course{stId = 2, courseName = "art" },
   new Course{stId = 1,courseName = "history" },
   new Course{stId = 3, courseName = "history" },
   new Course{stId = 3,courseName = "physics" },
  };
 
  static void Main( string [] args)
  {
   //查詢全部選修了history課的學生名
   var query = from s in students
    join c in courses on s.stId equals c.stId
    where c.courseName == "history"
    select s.stuName;
 
   foreach ( string str in query)
   {
   Console.Write( "{0} " , str);
   }
   Console.ReadKey();
  }
  }
}

輸出 jack flemingci

講解一下查詢過程:它會依次使用student中的對象與course中的全部對象進行對比,查找是否符合 s.stId equals c.stId where c.courseName == "history" 要求。文檔

 

stID stuName
1 jack
2 taylor
3 fleming

 

 

 stID  courseName
 1  art
 2  art
 1  history
 3  history
 3  physics

即先將(1,jack)和(1,art),(2,art)...(3,physics)分別匹配,而後再(2,taylor)和(1,art),(2,art)...(3,physics),直到全部都匹配完,最終能夠找到兩條能夠匹配的結果

 where子句  

where子句根據以後的運算來除去不符合要求的項,一個查詢表達式能夠有任意多個where子句,一個項必須知足全部的where條件才能避免被過濾,其語法爲

?
1
2
where BoolenExpression1
where BoolenExpression2

前面的例子已經屢次用過where,這裏就不舉例了

 orderby子句  

orderby能夠很方便的將返回的數據進行排序,可選ascending和descending兩種方式,默認的是ascending

語法: orderby Expression ascending or descending 二選一

爲join子句中的例子增長一個orderby子句,返回結果就變成了 fleming jack

?
1
2
3
4
5
var query = from s in students
       join c in courses on s.stId equals c.stId
       where c.courseName == "history"
               orderby s.stuName   //排序
       select s.stuName;
 group子句  

group子句可讓你把select的結果按指定的鍵(key)進行分組 ,每個分組由一個叫作鍵的字段區分,分組自己是可枚舉類型的而且能夠枚舉它的項

?
1
2
3
4
5
6
7
8
9
10
11
var query = from student in students
    group student by student.major;
 
    foreach (var s in query)
    {
     Console.WriteLine( "{0}" , s.key);
     foreach (var t in s)
     {
      console.writeLine( " {0}" , t.Name);
     }
    }
 select子句  

select子句指定所選定的對象哪部分應該被選擇。能夠指定下面的任意一項

a: 整個數據項

b: 數據項的一個字段

c: 數據項中幾個字段組成的新對象(或相似其餘值)

?
1
2
3
4
5
6
7
8
9
10
11
var query = from s in students
       select s; //整個數據項
 
    var query = from s in students
       select s.stuName; //s中的一個字段
 
    var query = from a in groupA
       from b in groupB
       let sum = a + b
       where sum < 12
       select new (a, b, sum);  //a,b,sum組成的新字段
 查詢延續: into子句  

查詢延續子句能夠接受查詢的一部分結構並賦予一個名字,從而能夠在查詢的另外一部分中使用

?
1
2
3
4
5
var someInt = from a in groupA
     from b in groupB
     into groupAandB
     from c in groupAandB
     select c;
   
   
   
   
   
   
   
   
   
   
   
       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

相關文章
相關標籤/搜索