接口的集合對象。LINQ的基本語法包含如下的8個上下文關鍵字,這些關鍵字和具體的說明如下:關鍵字說明from指定范圍變量和數據源wher" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

LINQ基本子句使用方法

系統 1882 0

?

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 產生一個用于存儲查詢表達式中的子表達式查詢結果的 范圍變量

??

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);
        }
    }
}
    

?程序的運行結果如下:

?

LINQ基本子句使用方法
? 程序中列舉了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子句的寫法。程序的運行結果如下:

?

LINQ基本子句使用方法
?

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";
        }
    }
}
    

?程序的運行結果如下:

?

LINQ基本子句使用方法
?

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);
        }
    }
}
    

? 程序的運行結果如下:

?

LINQ基本子句使用方法
?

?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);
        }
    }
}
    

?程序運行結果如下:

?


LINQ基本子句使用方法
?

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);
        }
    }
}
    

?程序運行結果如下:

?

LINQ基本子句使用方法
?

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);
        }
    }
}
    

?程序的運行結果如下:

?

LINQ基本子句使用方法
?

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);
            
        }
    }
}
    

?程序結果如下:

?

LINQ基本子句使用方法
?

?

?

?

?

LINQ基本子句使用方法


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产首页精品 | 国产精品人成人免费国产 | 欧美另类综合 | 欧美黄色网页 | 亚洲激情网站 | 四虎网址在线观看 | 久久99热久久精品在线6 | 一级毛片一级毛片免费毛片 | 中文字幕亚洲无线码在线一区 | 国产3区| 免费国产免费福利视频 | 在线观看中文字幕一区 | 国产精品亚洲玖玖玖在线靠爱 | aaa毛片视频免费观看 | 国产热re99久久6国产精品 | 四虎在线影视在线影库 | 欧美久久精品一级c片片 | 免费黄色在线观看 | 久久久久久久久久爱 | 国产精品久久久久久久久久久久 | 国内精品免费久久影院 | 亚洲免费毛片 | 日本一级大黄毛片一级 | 国产日韩精品欧美在线ccc | 欧美人猛交日本人xxx | 亚洲va欧美 | 久久好看视频 | 日日夜夜中文字幕 | 奇米在线影视 | 国产精品玖玖玖在线观看 | 日韩网站在线 | 日韩爱爱 | 国产日韩不卡免费精品视频 | 亚洲精品色一区二区三区 | 天天躁天天碰天天看 | 99精品免费视频 | 国产日韩欧美综合 | 日韩欧美在| 99爱视频免费高清在线观看 | 亚洲欧洲日韩国产一区二区三区 | 日日摸夜夜欧美一区二区 |