国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#使用LINQ查詢表達式的基本子句總結

2020-01-24 01:14:41
字體:
來源:轉載
供稿:網友

LINQ查詢表達式的基本語法很容易掌握,它使用C#常見的語言構造,從外觀上看,和我們常用的SQL類似,并且查詢表達式中的變量可以用匿名類型,所以在很多情況下,不需要指定變量類型就可以構建LINQ表達式。

LINQ的數據源可以是數據庫對象或是XML流等,也可以使實現了IEnumerable或者泛型IEnumberable<T>接口的集合對象。

LINQ的基本語法包含如下的8個上下文關鍵字,這些關鍵字和具體的說明如下:

關鍵字
說明
from 指定范圍變量和數據源
where 根據bool表達式從數據源中篩選數據
select 指定查詢結果中的元素所具有的類型或表現形式
group 對查詢結果按照鍵值進行分組(IGrouping<TKey,TElement>)
into 提供一個標識符,它可以充當對join、group或select子句結果的引用
orderby 對查詢出的元素進行排序(ascending/descending)
join 按照兩個指定匹配條件來Equals連接兩個數據源
let 產生一個用于存儲查詢表達式中的子表達式查詢結果的范圍變量

下面依此總結這8個關鍵字的常用查詢語句寫法。

1.from子句
如果要寫一個LINQ表達式,就必須是以from子句開頭。個人覺得from子句中需要注意的地方就是多個from子句的書寫。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace LINQ{  /// <summary>  /// LINQ,重點是感悟from子句中的查詢變量的靈活  /// </summary>  class Program  {    static void Main(string[] args)    {      //1單個form子句      string[] values = { "LINQ學習","LINQ基本語句","from子句","單個from子句"};      var value = from v in values            where v.IndexOf("LINQ") > -1            select new { v, v.Length };      foreach (var n in value)      {        Console.WriteLine("{0},{1}",n.v,n.Length );      }      Console.ReadKey(false);      //2使用LINQ查詢ArrayList      ArrayList gList = new ArrayList();      gList.Add(new GustInfo { Name="DebugLZQ", Age=26, Tel="88888888"});      gList.Add(new GustInfo { Name="博客園",Age=6, Tel ="666666"});      gList.Add(new GustInfo { Name = "M&MSoft", Age =9, Tel = "55555" });      var query = from GustInfo gust in gList            where gust.Age > 9            select gust;//范圍變量gust制定了數據類型      foreach (GustInfo g in query)      {        Console.WriteLine("{0} 年齡:{1} 電話:{2}",g.Name,g.Age,g.Tel );      }      Console.ReadKey(false);      //3復合from子句      List<GustInfo2> gList2 = new List<GustInfo2>()       {        new GustInfo2{ Name="DebugLZQ",Age=26,TelTable=new List<string>(){"8888888","138******"}},        new GustInfo2{ Name="博客園",Age=6,TelTable =new List<string>(){"666666","138******"}},        new GustInfo2{ Name="M&MSoft",Age=9,TelTable=new List<string>(){"55555","138******"}}      };      //gust、tel都是查詢變量,作用域為當前查詢語句!!!      var query2 = from gust in gList2             from tel in gust.TelTable              where tel.IndexOf("5555") > -1             select gust;      foreach (var g in query2)      {        Console.WriteLine("{0} 年齡{1}",g.Name,g.Age );        foreach (var t in g.TelTable)        {          Console.WriteLine("電話:{0}",t);        }      }      Console.ReadKey(false);      //4多個from子句      var query3 = from GustInfo gust in gList             where gust.Age > 6             from GustInfo2 gust2 in gList2             where gust2.Age> 9             select new { gust, gust2 };//查詢結果定制      foreach (var g in query3)      {        Console.WriteLine("{0} {1}", g.gust.Name, g.gust2.Name);      }      Console.ReadKey(false);    }  }}

程序的運行結果如下:

201637153703558.png (677×442)

程序中列舉了from子句的用法示例,注意復合from子句和多個from子句的書寫,同時需要理解范圍變量和數據源變量這兩個概念。

 2.where子句
where子句,它是LINQ表達式的元素篩選機制,除了開始和結束的位置,它幾乎可以出現在LINQ表達式的任意位置上。

在一個LINQ表達式中,可以有where子句,也可以沒有;可以有一個,也可以有多個;多個where子句之間的邏輯關系相當于邏輯“與”,每個where子句可以包含1個或多個bool邏輯表達式,這些條件成為謂詞,謂詞邏輯之間用的是“&&”“||”等而不是SQL中的and 、or。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_WHERE{  /// <summary>  /// LINQ where子句  /// </summary>  class Program  {    static void Main(string[] args)    {      //1常見的where語句      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ", Age=26,Tel="88888888"},        new GustInfo(){ Name="cnblogs",Age=6,Tel="666666"},        new GustInfo(){ Name="M&MSoft",Age=9,Tel="55555"}      };      var query = from gust in gList            where (gust.Name.Length > 7 || gust.Name.Substring(0, 1) == "M") && gust.Age > 9            select new { gust.Name, gust.Age };      foreach (var g in query)      {        Console.WriteLine("{0},{1}", g.Name, g.Age);      }      Console.ReadKey(false);      //2.在where子句中使用自定義函數      var query2 = from GustInfo gust in gList             where gust.Name.Length > 5             && Check(gust.Name)             select gust;      foreach (var g in query2)      {        Console.WriteLine("{0},{1},{2}", g.Name, g.Age, g.Tel);      }      Console.ReadKey(false);      //3.動態謂詞的篩選      //定義動態謂詞數組,在實際開發中可以動態獲得      string[] names = { "SB","XXX","***","@@@","一些敏感詞"};      var query3 = from GustInfo guest in gList             where !names.Contains(guest.Name)             select guest;      foreach (var q in query3)      {        Console.WriteLine("{0} 年齡:{1},電話:{2}",q.Name,q.Age,q.Tel );      }      Console.ReadKey(false);    }    //自定義函數    static bool Check(string name)    {      if (name.Substring(0, 1) == "N")        return false;      return true;    }  }}

需要注意一些常用的where子句的寫法。程序的運行結果如下:

201637153755441.png (677×442)

3.Select子句
在select子句上可以非常靈活的處理查詢到的元素,然后再把結果返回。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_select{  /// <summary>  /// LINQ select  /// 在select子句上,可以非常靈活的處理查詢到的元素,然后再把結果返回  /// </summary>  class MyGustInfo  {    public string Name { get; set; }    public int Age { get; set; }  }  class Program  {    static void Main(string[] args)    {      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ", Age=25, Tel="88888888"},         new GustInfo(){ Name="cnblogs", Age=6, Tel="666666"},         new GustInfo(){ Name="M&M", Age=9, Tel="55555"}      };      var query = from gust in gList            where gust.Age >= 9 && gust.Age <= 30            select gust.Name.Replace("&", "mm");//select子句靈活應用      var query2 = from gust in gList             where gust.Age >= 9 && gust.Age <= 30             select MyProc(gust.Name);      var query3 = from gust in gList             where gust.Age >= 9 && gust.Age <= 30             select new { gust.Name,gust.Age};      var query4 = from gust in gList             where gust.Age >= 9 && gust.Age <= 30             select new MyGustInfo { Name=gust.Name+"My", Age=gust.Age+1};//對查詢結果進行投影      foreach (var v in query)      {        Console.WriteLine(v);      }      foreach (var v in query2)      {        Console.WriteLine(v);      }      foreach (var v in query3)      {        Console.WriteLine(v.Name+v.Age );      }      foreach (var v in query4)      {        Console.WriteLine(v.Name+v.Age );      }      Console.ReadKey(false);    }    static string MyProc(string s)    {      return s + "Better";    }  }}

程序的運行結果如下:

 4.group子句
 根據語法的規定,LINQ表達式必須以from子句開頭,以select或group子句結束,所以除了使用select來返回結果外,也可以使用group子句來返回元素分組后的結果。

group子句返回的是一個基于IGrouping<TKey,TElement>泛型接口的對象序列。

語法和SQL的group有點區別,不注意的話可能會寫錯。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_group{  /// <summary>  /// LINQ group子句  /// </summary>  class Program  {    static void Main(string[] args)    {      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},      };      var query = from guest in gList            group guest by guest.Name.Substring(0, 1);//分組鍵key是string類型      //遍歷鍵值和鍵值所屬元素      foreach (IGrouping<string, GustInfo> guestGroup in query)      {        Console.WriteLine("分組鍵:{0}",guestGroup.Key );        foreach (var g in guestGroup)        {          Console.WriteLine("{0} 年齡:{1} 電話:{2}",g.Name,g.Age,g.Tel );        }      }      Console.ReadKey(false);      Console.WriteLine("-----------------------------------");      var query2 = from guest in gList             group guest by guest.Age > 20;//分組鍵key是bool類型表達式的結果      foreach (IGrouping<bool, GustInfo> guestGroup in query2)      {        Console.WriteLine("年齡是否大于20 分組鍵:{0}", guestGroup.Key);        foreach (var g in guestGroup)        {          Console.WriteLine("{0} 年齡:{1} 電話:{2}", g.Name, g.Age, g.Tel);        }      }      Console.ReadKey(false);    }  }}

程序的運行結果如下:

201637153931581.png (677×442)

5.into子句
 into子句作為一個臨時標識符,用于group、select、join子句中充當其結果的引用。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_into{  /// <summary>  /// LINQ group  /// </summary>  class Program  {    static void Main(string[] args)    {      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},      };      //1.into用于group子句      var query = from guest in gList            group guest by guest.Name.Substring(0, 1) into grguest            orderby grguest.Key descending            select grguest;      var query2 = from guest in gList            group guest by guest.Name.Substring(0, 1) into grguest            orderby grguest.Key ascending             select grguest;      //2.select 子句中的into子句      var query3 = from guest in gList             select new { NewName = guest.Name, NewAge = guest.Age } into newguest             orderby newguest.NewAge             select newguest;      foreach (var guestGroup in query)      {        Console.WriteLine("分組鍵:{0}",guestGroup.Key );        foreach (var g in guestGroup)        {          Console.WriteLine("{0} 電話:{1}",g.Name,g.Tel );        }      }      Console.ReadKey(false);      foreach (var newg in query3)      {        Console.WriteLine("{0} 年齡:{1}",newg.NewName,newg.NewAge );      }      Console.ReadKey(false);    }  }}

程序運行結果如下:

201637154008267.png (677×442)

6.orderby子句、thenby子句
 LINQ可以按照元素的一個或多個屬性對元素進行排序。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_orderby{  class Program  {    /// <summary>    /// LINQ orderby (ascending descending)    /// </summary>    /// <param name="args"></param>    static void Main(string[] args)    {      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},      };      //按照年齡排序      var query = from guest in gList            orderby guest.Age            select guest;      var query1 = from guest in gList             orderby guest.Age ascending             select guest;      var query2 = from guest in gList             orderby guest.Age descending             select guest;      //按照年齡進行排序,按照名字字數進行次要排序      var query3 = from guest in gList            orderby guest.Age, guest.Name.Length            select guest;      var query4 = from guest in gList             orderby guest.Age descending , guest.Name.Length ascending              select guest;      var query5 = from guest in gList             orderby guest.Age, guest.Name.Length,guest.Tel              select guest;      foreach (var guest in query2)      {        Console.WriteLine("{0} 年齡:{1} 電話:{2}",guest.Name,guest.Age,guest.Tel );      }      Console.ReadKey(false);      foreach (var guest in query4)      {        Console.WriteLine("{0} 年齡:{1} 電話:{2}", guest.Name, guest.Age, guest.Tel);      }      Console.ReadKey(false);    }  }}

程序運行結果如下:

201637154108735.png (677×442)

7.let子句
let子句用于在LINQ表達式中存儲子表達式的計算結果。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_let{  /// <summary>  /// LINQ let用來存子儲表達式的計算結果  /// </summary>  class Program  {    static void Main(string[] args)    {      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},      };      //使用let子句創建范圍變量g,并通過g構建查詢表達式      var query = from guest in gList            let g = guest.Name.Substring(0, 1)            where g == "D" || g == "J"            select guest;      //也可以不使用let,上面的語句等效于下      var query2 = from guest in gList             where guest.Name.Substring(0, 1) == "D" || guest.Name.Substring(0, 1) == "J"             select guest;      foreach (var g in query)      {        Console.WriteLine("{0} 年齡:{1} 電話:{2}",g.Name,g.Age,g.Tel );      }      Console.ReadKey(false);      Console.WriteLine("不使用let,等效的語句結果");      foreach (var g in query2)      {        Console.WriteLine("{0} 年齡:{1} 電話:{2}", g.Name, g.Age, g.Tel);      }      Console.ReadKey(false);    }  }}

程序的運行結果如下:

201637154137605.png (677×442)

8.join子句
如果一個數據源中元素的某個屬性可以跟另外一個數據源的中元素的某個屬性進行相等比較,那么這兩個數據源可以用join子句進行關聯。

join子句使用equals關鍵字進行相等比較,而不是常用的雙等號。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LINQ_join{  class Program  {    static void Main(string[] args)    {      //定義兩個數據源      List<GustInfo> gList = new List<GustInfo>()       {        new GustInfo(){ Name="DebugLZQ",Age=26,Tel="187********"},        new GustInfo(){ Name="Sarah",Age=25,Tel="159********"},        new GustInfo(){ Name="Jerry",Age=35,Tel="135********"},        new GustInfo(){ Name="M&M",Age=16,Tel="136********"},        new GustInfo(){ Name="DebugMan",Age=26,Tel="136********"},        new GustInfo(){ Name="Jerry&Tom",Age=19,Tel="136********"},      };      List<GuestTitle> titleList = new List<GuestTitle>()       {        new GuestTitle(){Name="DebugLZQ",Title="Soft Engineer"},        new GuestTitle(){Name="DebugLZQ",Title="Team Leader"},        new GuestTitle(){Name="Sarah",Title="Test Engineer"},        new GuestTitle(){Name="Jerry",Title="Head Master"}      };      //1.根據姓名進行內連接      var query = from guest in gList            join title in titleList on guest.Name equals title.Name            select new { Name=guest.Name ,Title=title.Title,Age=guest.Age };      foreach (var g in query)      {        Console.WriteLine("{0} {1} 年齡:{2}",g.Name,g.Title ,g.Age );      }      Console.ReadKey(false);      //前面的多個from實現相同的作用:與內連接區別在于:這個中間的操作是叉乘獲得笛卡爾積      var query2=from guest in gList             from title in titleList             where guest.Name==title.Name            select new { Name = guest.Name, Title = title.Title, Age = guest.Age };      foreach (var g in query2)      {        Console.WriteLine("{0} {1} 年齡:{2}", g.Name, g.Title, g.Age);      }      Console.ReadKey(false);      //2.根據姓名進行分組連接      //根據名字分組后,得到每個名字下的全部名稱      var query3 = from guest in gList             join title in titleList on guest.Name equals title.Name into tgroup             select new { Name=guest.Name,Titles=tgroup };      foreach (var g in query3)      {        Console.WriteLine(g.Name);        foreach (var g2 in g.Titles)        {          Console.WriteLine("  {0}",g2.Title );        }      }      Console.ReadKey(false);      //3.根據姓名進行左外連接      //無職務的輸出為空缺      var query4 = from guest in gList             join title in titleList on guest.Name equals title.Name into tgroup             from subtitle in tgroup.DefaultIfEmpty()             select new { Name=guest.Name,Title=subtitle==null?"空缺":subtitle.Title };      foreach (var g in query4)      {        Console.WriteLine("{0} {1} ",g.Name ,g.Title );      }      Console.ReadKey(false);          }  }}

程序結果如下:

201637154220463.png (677×442)

以上就是LINQ的基本子句的常用用法,文字不是很多,因為代碼中都有詳細的注釋說明。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德阳市| 吴川市| 岳普湖县| 饶平县| 什邡市| 教育| 清涧县| 郎溪县| 耿马| 长葛市| 天柱县| 石泉县| 基隆市| 交口县| 陆川县| 阳西县| 信阳市| 青岛市| 邯郸市| 西和县| 渑池县| 蒙自县| 浮梁县| 光泽县| 涟水县| 遂宁市| 华阴市| 扎鲁特旗| 临安市| 黄山市| 县级市| 杭锦后旗| 枣强县| 卢龙县| 庆阳市| 儋州市| 屯留县| 昭觉县| 吉林市| 建宁县| 湘潭市|