0

0

C#Linq查询操作使用举例

黄舟

黄舟

发布时间:2017-03-04 10:48:05

|

2021人浏览过

|

来源于php中文网

原创


Linq标准查询操作符

语言集查询 ganmge hteg.ratedquw,linq,集 成了c#编程语言中的查询语法 ,可 以用相同的语法访问不同的数据源。 linq提 供了不同数据源的抽象层 ,所 以可以使用相同的语法。

1筛选操作符

筛选操作符定义了返回元素的条件。

筛选操作符 描述
where 使用谓词,返回布尔值
OfType 根据类型筛选元素

应用举例:
where用法:

 var racers = from r in Formulal.Racers                         
 where r.Wins > 15 && r.Country == "Brazil" select r;

OfType用法:

object[] data = {"one", 2, "three", 4, 5, "six"};            
var rtnData = data.OfType(); //返回类型为string的数据元素集合

2投射操作符

把对象转化为另一个类型的新对象

投射操作符 描述
select
selectMany

用法举例:
select用法

var racers = from r in Formulal.Racers
                         where r.Wins > 15 && r.Country == "Brazil"
                         select new
                         {
                             Name = string.Format("{0} {1}", r.FirstName, r.LastName),
                             Country = r.Country,
                             Wins = r.Wins
                         };   //输出为含有Name,Country,Wins共计3个属性的对象集合

selectMany用法

            var ferrariDrivers = Formulal.Racers.
            SelectMany(r => r.Cars,
            (r, c) => new { Racer = r, Car = c }).
            Where(r => r.Car == "Ferrari").
            OrderBy(r => r.Racer.LastName).
            Select(r => r.Racer.FirstName + " " + r.Racer.LastName);//筛选出驾驶法拉利的选手集合

3排序操作符

改变返回元素的顺序

排序操作符 描述
OrderBy 升序排序
OrderByDescending 降序排序
ThenBy 第一次排序结果类似,用第二次升序排序
ThenByDescending 第一次排序结果类似,用第二次降序排序
Reverse 反转集合中元素的顺序

举例:

    var racers = from r in Formulal.Racers                          
    where r.Country == "Brazil"
                          orderby r.Wins descending
                          select new
                          {
                              Name = string.Format("{0} {1}", r.FirstName, r.LastName),
                              Country = r.Country,
                              Wins = r.Wins
                          };//国家为巴西,按照胜场次数降序排列

4连接运算符

用于合并不直接相关的集合

连接运算符 描述
Join 可以根据键选择器函数连接连接2个集合
GroupJoin 连接两个集合,组合其结果
//Join连接
            //获取冠军年份在2003年后的选手
            var racer5 = from r in Formulal.Racers                
            from y in r.Years                
            where y > 2003
                select new
                {
                    Year = y,
                    Name = string.Format("{0} {1}", r.FirstName, r.LastName)
                };            //获取冠军年份在2003年后的团队
            var team1 = from r in Formulal.ChampionTeams                         
            from y in r.Years                         
            where y > 2003
                         select new
                         {
                             Year = y,
                             Name = string.Format("{0}", r.Name)
                         };            
                         //连接
            var racerAndTeams = from r in racer5                
            join t in team1 on r.Year equals t.Year                
            select new
                {
                    Yearj= r.Year,
                    Racerj = r.Name,
                    Teamj = t.Name
                };

结果:

25175企业客户管理系统2.5.1
25175企业客户管理系统2.5.1

25175企业客户管理系统能够方便的录入新的信息例如新的项目、新增客户等同时能够清楚的管理一些款项结算。由于功能的强大,用户可以在该系统上发表文章后让员工递交工作计划或工作报告。加强企业工作效率,为企业提高实力。因为该系统可由客户、程序员、负责人等身份登入 所以适合广大企业使用。管理首页:{信息录入|信息修改|信息查询}1信息录入:你可以根据实际情况进行以下操作 1-1新的项目

下载
Yearj Racerj Teamj
Yearj=2004 Racerj=Michael Schumacher Teamj =Ferrari
Yearj=2005 Racerj=Fernando Alonso Teamj =Renault
Yearj=2006 Racerj=Fernando Alonso Teamj =Renault
Yearj=2007 Racerj=Kimi Räikkönen Teamj =Ferrari
Yearj=2008 Racerj=Lewis Hamilton Teamj =Ferrari
Yearj=2014 Racerj=Lewis Hamilton Teamj =Mercedes
Yearj=2015 Racerj=Lewis Hamilton Teamj =Mercedes
Yearj=2009 Racerj=Jenson Button Teamj =Brawn GP
Yearj=2010 Racerj=Sebastian Vettel Teamj =Red Bull Racing
Yearj=2011 Racerj=Sebastian Vettel Teamj =Red Bull Racing
Yearj=2012 Racerj=Sebastian Vettel Teamj =Red Bull Racing
Yearj=2013 Racerj=Sebastian Vettel Teamj =Red Bull Racing

5组合运算符

把数据放在组中

组合运算符 描述
GroupBy 组合有公共键的元素
ToLookUp 通过创建一个一对多的字典,来组合元素。

GroupBy用法举例:

 var countries = from r in Formulal.Racers                            
 group r by r.Country into g                            
 orderby g.Count() descending, g.Key                            
 where g.Count() > 2
                            select new 
                            { 
                                Country = g.Key, 
                                Count = g.Count() 
                            };//获取冠军次数大于2的国家

结果:

Country Count
UK 10
Brazil 3
Finland 3

6量词操作符

如果元素序列满足指定的条件 ,量词操作符就返回布尔值

组合运算符 描述
Any 确定集合中是否有满足谓词函数的元素
All 确定集合中是否都满足谓词函数的元素
Contains 检查某个元素是否存在集合中
            List intList1 = new List(5) {1, 2, 3, 4, 5};           
            bool any3 = intList1.Any(r => r == 3);//确定集合中是否有3,返回true
            bool any0 = intList1.Any(r => r == 0);//确定集合中是否有0,返回false
            bool allMoreZero = intList1.All(r => r > 0);//确定序列中所有元素都满足大于0,返回true
            bool allMore2 = intList1.All(r => r > 2); //返回false
            bool contains3 = intList1.Contains(3); //元素3是否在集合中,true

7分区操作符

分区操作符,返回一个子集。使用它们可以得到部分结果。

分区运算符 描述
Take 必须制定提取元素的个数
Skip 跳过指定的元素个数,提取其他元素
TakeWhile 提取条件为真的元素
SkipWhile 跳过条件为真的元素
            int pageSize = 5;            
            int numberPages = (int)Math.Ceiling(Formulal.Racers.Count() / (double)pageSize);            
            for (int page = 0; page < numberPages; page++)
            {                var racersPartition =
                    (from r in Formulal.Racers                     
                    orderby r.LastName, r.FirstName                     
                    select r.FirstName + " " + r.LastName).Skip(page * pageSize).Take(pageSize);                       
            }

结果:

Page 0Fernando Alons
Mario Andretti
Alberto Ascari
Jack Brabham
Jenson ButtonPage 1Jim Clark
Juan Manuel Fa
Nino Farina
Emerson Fittipaldi
Mika Hakkinen
Page 2Lewis Hamilton
Mike Hawthorn
Damon Hill
Graham Hill
Phil Hill

8集合操作符(Set operators)

集合操作符返回 一 个集合。除了Distinct之外,其他都需要2个集合。

集合操作符 描述
Distinct 从集合中删除重复的元素
Union 返回出现在其中一个集合中的唯一元素
Intersect 交集
Except 只出现在一个集合中的元素
Zip 通过使用指定的谓词函数合并2个集合

应用举例:

            List intList1 = new List(5) {1, 2, 3, 4, 5,3};            
            List intList2 = new List(3) {2, 5, 0};            
            var delDuplic = intList1.Distinct(); //去重,结果{1,2,3,4,5}
            var unionList = intList1.Union(intList2); //并集,结果{1,2,3,4,5,0}
            var interList = intList1.Intersect(intList2); //交集,结果{2,5}
            var exceptList = intList1.Except(intList2);//差集,结果{1,3,4}
            var exceptList2 = intList2.Except(intList1);//差集,结果{0}
            var unionList2 = intList1.Zip(intList2,((i1, i2) => i1+", "+i2));
             结果:{{1,2}{2,5}{3,0}}

9元素操作符(Element operators)

这些元素操作符仅返回一 个元素。

元素操作符 描述
First 返回第一个满足条件的元素
FirstOrDefault 返回第一个满足条件的元素,但如果没有找到满足条件的元素,就返回类型的默认值
Last 返回最后一个满足条件的元素
LastOrDefault 返回最后一个满足条件的元素,但如果没有找到满足条件的元素,就返回类型的默认值
ElementAt 指定了要返回的元素的位置
ElementAtOrDefault 指定了要返回的元素的位置,但如果没有找到满足条件的元素,就返回类型的默认值
Single 只返回一个满足条件的元素,如果有多个满足条件,就抛出一个异常。
SingleOrDefault 只返回一个满足条件的元素,但如果没有找到满足条件的元素,就返回类型的默认值

应用举例:

List intList1 = new List(5) { 1, 8, 3, 4, 5, 3 };
int firstMore1 = intList1.First(r => r > 1);
//结果:8int firstMore17 = intList1.FirstOrDefault(r => r > 17); 
//结果:0(因为不存在)int lastMore3 = intList1.Last(r => r > 3); 
//结果5int last = intList1.ElementAt(2); 
//结果3,(索引从0开始)

10聚合操作符(Aggregate operators)

聚合操作符计算集合的一个值。利用这些聚合操作符 ,可 以计算所有值的总和、所有元
素的个数、值最大和最小的元素 ,以 及平均值等

聚合操作符 描述
Count 所有值的个数
Sum 所有值的综合
Min 所有值的的最小值
Max 所有值的的最大值
Average 所有值的平均数
            public class MyIntClass
            {                
            public string Name { get; set; }                
            public int Integar { get; set; }                
            public MyIntClass(string name, int i)
                {                    
                this.Name = name;                    
                this.Integar = Integar;
                }
            }
            List intList1 = new List(5) 
            { 
                new MyIntClass("first",1),                
                new MyIntClass("second",8) ,                
                new MyIntClass("third",3) ,                
                new MyIntClass("fourth",4) ,                
                new MyIntClass("fifth",5) ,                
                new MyIntClass("sixth",3) 
            };            
            int count = intList1.Count;            
            int sum = intList1.Sum(r=>r.Integar);            
            int min = intList1.Min(r => r.Integar);            
            int max = intList1.Max(r => r.Integar);            
            double average = intList1.Average(r => r.Integar);

11转换操作符(Conversion operators)

转换操作符将集合转换为数组 :IEnumberable、 IList, IDictionary 等。

Conversion operators 描述
ToArray 集合转化为Array
AsEnumerable 返回类型为IEnumerable
ToList 集合转化为List
ToDictionary 集合转化为Dictionary
Cast 映射

还是上面的例子

         IEnumerable ienuList = from r in intList1 where r.Integar > 3 select r; //返回默认的IEnumerable集合
         List ienuList2 = (from r in intList1 where r.Integar > 3 select r).ToList(); //返回List
         MyIntClass[] ienuList2 = (from r in intList1 where r.Integar > 3 select r).ToArray();//返回数组
         var dict = (from r in intList1 where r.Integar > 3 select r).ToDictionary(r=>r.Name,r=>r.Integar); //字典,key是name, value:Integar
         IEnumerable ienuList2 = (from r in intList1 where r.Integar > 3 select r).AsEnumerable();

12生成操作符(Generation operators)

这些生成操作符返回 一 个新集合

Generation operators 描述
Empty 集合是空的
Range 返回一系列数字
Repeat 返回始终重复一个值的集合
IEnumerable ints = Enumerable.Range(3, 10);
//{3,4,5,6,7,8,9,10,11,12}IEnumerable emptyInts =  Enumerable.Empty();
//生成一个空集合IEnumerable ints2= Enumerable.Repeat(6,8);
//生成8个6的集合

附:展示所用到的实体类和数据

选手实体类

   //选手实体类
   public class Racer 
    {        public Racer(string firstName = null, string lastName = null, 
    string country = null, int starts = 0,int wins = 0, IEnumerable years = null, IEnumerable cars = null)
        {            this.FirstName = firstName;            
        this.LastName = lastName;            
        this.Country = country;            
        this.Starts = starts;            
        this.Wins = wins;            
        var yearList = new List();            
        if (years != null)
            {                
            foreach (var year in years)
                {
                    yearList.Add(year);
                }                this.Years = yearList.ToArray();
            }            if (cars != null)
            {                var carList = new List();                
            foreach (var car in cars)
                {
                    carList.Add(car);
                }                
                this.Cars = carList.ToArray();
            }           public string FirstName { get; set; }          
             public string LastName { get; set; }           //赢得比赛的次数
           public int Wins { get; set; }           //所属国家
           public string Country { get; set; }           //开始做的年龄
           public int Starts { get; set; }           //车型数组
           public string[] Cars { get; private set; }           //赢得冠军的年份
           public int[] Years { get; private set; }   
         }
      }

选手数据

//选手实体类
   public class Racer 
    {
        public Racer(string firstName = null, string lastName = null, string country = null, int starts = 0,int wins = 0, 
        IEnumerable years = null, IEnumerable cars = null)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Country = country;
            this.Starts = starts;
            this.Wins = wins;
            var yearList = new List();
            if (years != null)
            {
                foreach (var year in years)
                {
                    yearList.Add(year);
                }
                this.Years = yearList.ToArray();
            }
            if (cars != null)
            {
                var carList = new List();
                foreach (var car in cars)
                {
                    carList.Add(car);
                }
                this.Cars = carList.ToArray();
            }

           public string FirstName { get; set; }
           public string LastName { get; set; }
           //赢得比赛的次数
           public int Wins { get; set; }
           //所属国家
           public string Country { get; set; }
           //开始做的年龄
           public int Starts { get; set; }
           //车型数组
           public string[] Cars { get; private set; }
           //赢得冠军的年份
           public int[] Years { get; private set; }   
         }
      }
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
选手数据

//选手List
        public static List Racers = new List(40)
        {         
                new Racer("Nino", "Farina", "Italy", 33, 5, new int[] { 1950 }, new string[] { "Alfa Romeo" }),
                new Racer("Alberto", "Ascari", "Italy", 32, 10, new int[] { 1952, 1953 }, new string[] { "Ferrari" }),
                new Racer("Juan Manuel", "Fangio", "Argentina", 51, 24, new int[] { 1951, 1954, 1955, 1956, 1957 }, 
                new string[] { "Alfa Romeo", "Maserati", "Mercedes", "Ferrari" }),
                new Racer("Mike", "Hawthorn", "UK", 45, 3, new int[] { 1958 }, new string[] { "Ferrari" }),
                new Racer("Phil", "Hill", "USA", 48, 3, new int[] { 1961 }, new string[] { "Ferrari" }),
                new Racer("John", "Surtees", "UK", 111, 6, new int[] { 1964 }, new string[] { "Ferrari" }),
                new Racer("Jim", "Clark", "UK", 72, 25, new int[] { 1963, 1965 }, new string[] { "Lotus" }),
                new Racer("Jack", "Brabham", "Australia", 125, 14, new int[] { 1959, 1960, 1966 }, new string[] { "Cooper", "Brabham" }),
                new Racer("Denny", "Hulme", "New Zealand", 112, 8, new int[] { 1967 }, new string[] { "Brabham" }),
                new Racer("Graham", "Hill", "UK", 176, 14, new int[] { 1962, 1968 }, new string[] { "BRM", "Lotus" }),
                new Racer("Jochen", "Rindt", "Austria", 60, 6, new int[] { 1970 }, new string[] { "Lotus" }),
                new Racer("Jackie", "Stewart", "UK", 99, 27, new int[] { 1969, 1971, 1973 }, new string[] { "Matra", "Tyrrell" }),
                new Racer("Emerson", "Fittipaldi", "Brazil", 143, 14, new int[] { 1972, 1974 }, new string[] { "Lotus", "McLaren" }),
                new Racer("James", "Hunt", "UK", 91, 10, new int[] { 1976 }, new string[] { "McLaren" }),
                new Racer("Mario", "Andretti", "USA", 128, 12, new int[] { 1978 }, new string[] { "Lotus" }),
                new Racer("Jody", "Scheckter", "South Africa", 112, 10, new int[] { 1979 }, new string[] { "Ferrari" }),
                new Racer("Alan", "Jones", "Australia", 115, 12, new int[] { 1980 }, new string[] { "Williams" }),
                new Racer("Keke", "Rosberg", "Finland", 114, 5, new int[] { 1982 }, new string[] { "Williams" }),
                new Racer("Niki", "Lauda", "Austria", 173, 25, new int[] { 1975, 1977, 1984 }, new string[] { "Ferrari", "McLaren" }),
                new Racer("Nelson", "Piquet", "Brazil", 204, 23, new int[] { 1981, 1983, 1987 }, new string[] { "Brabham", "Williams" }),
                new Racer("Ayrton", "Senna", "Brazil", 161, 41, new int[] { 1988, 1990, 1991 }, new string[] { "McLaren" }),
                new Racer("Nigel", "Mansell", "UK", 187, 31, new int[] { 1992 }, new string[] { "Williams" }),
                new Racer("Alain", "Prost", "France", 197, 51, new int[] { 1985, 1986, 1989, 1993 }, new string[] { "McLaren", "Williams" }),
                new Racer("Damon", "Hill", "UK", 114, 22, new int[] { 1996 }, new string[] { "Williams" }),
                new Racer("Jacques", "Villeneuve", "Canada", 165, 11, new int[] { 1997 }, new string[] { "Williams" }),
                new Racer("Mika", "Hakkinen", "Finland", 160, 20, new int[] { 1998, 1999 }, new string[] { "McLaren" }),
                new Racer("Michael", "Schumacher", "Germany", 287, 91, new int[] { 1994, 1995, 2000, 2001, 2002, 2003, 2004 }, 
                new string[] { "Benetton", "Ferrari" }),
                new Racer("Fernando", "Alonso", "Spain", 252, 32, new int[] { 2005, 2006 }, new string[] { "Renault" }),
                new Racer("Kimi", "Räikkönen", "Finland", 230, 20, new int[] { 2007 }, new string[] { "Ferrari" }),
                new Racer("Lewis", "Hamilton", "UK", 166, 43, new int[] { 2008, 2014, 2015 }, new string[] { "McLaren", "Mercedes" }),
                new Racer("Jenson", "Button", "UK", 283, 15, new int[] { 2009 }, new string[] { "Brawn GP" }),
                new Racer("Sebastian", "Vettel", "Germany", 156, 42, new int[] { 2010, 2011, 2012, 2013 }, new string[] { "Red Bull Racing" })

        };

团队实体类

    [Serializable]    public class Team
    {        public Team(string name, params int[] years)
        {            this.Name = name;            this.Years = years;
        }        public string Name { get; private set; }        
        public int[] Years { get; private set; }
    }

团队数据

        //冠军团队List
        public static List ChampionTeams = new List()
        {            
        new Team("Vanwall", 1958),            
        new Team("Cooper", 1959, 1960),            
        new Team("Ferrari", 1961, 1964, 1975, 1976, 1977, 1979, 1982, 1983, 1999, 2000, 2001, 2002, 2003, 2004, 2007,                
        2008),            new Team("BRM", 1962),            
        new Team("Lotus", 1963, 1965, 1968, 1970, 1972, 1973, 1978),            
        new Team("Brabham", 1966, 1967),            
        new Team("Matra", 1969),            
        new Team("Tyrrell", 1971),            
        new Team("McLaren", 1974, 1984, 1985, 1988, 1989, 1990, 1991, 1998),            
        new Team("Williams", 1980, 1981, 1986, 1987, 1992, 1993, 1994, 1996, 1997),            
        new Team("Benetton", 1995),            
        new Team("Renault", 2005, 2006),            
        new Team("Brawn GP", 2009),            
        new Team("Red Bull Racing", 2010, 2011, 2012, 2013),            
        new Team("Mercedes", 2014, 2015)
        };

 以上就是C#Linq查询操作使用举例的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.1万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 15.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号