c#进阶高级语法之LINQ

   

目录

一、Lambda表达式

      1.1.回顾委托

       1.2Lambda的使用

二、常用集合类的扩展方法 

2.1Where的使用

 2.2Cout的使用

2.3Any的使用

2.4获取一组数据的方法

 2.5排序方法

 2.6限制结果集

2.7聚合函数

2.8分组 (GroupBy)

 2.9投影(Select)

 2.10集合转换

 三、LINQ扩展方法之链式调用


    LINQ是.NET Core中提供的简化数据查询的技术。使用该技术可以用几行代码就实现复杂的数据查询。

一、Lambda表达式

        Lambda表达式是c#中的语法,他可以让我们进行函数式编程,减少代码量。

      1.1.回顾委托

        什么是委托?

        委托是一种指向方法的类型。

        委托的用法?

        在.NET中最多定义16个参数的泛型委托Action(无返回值)Func(有返回值),因此我们一般不用自定义委托,直接用Action或者Func这两个委托类型。

/*
 * 委托指向普通方法
 */
MyDelegate d1 = SayEnglish;
string s1 = d1(3);
Console.WriteLine(s1);
d1 = sayChinese;
string s2 = d1(5);
Console.WriteLine(s2);

static string SayEnglish(int age)
{
    return $"hello {age}";
}
static string sayChinese(int age)
{
    return $"你好 {age}";
}

delegate string MyDelegate(int n);//定义委托
/*
 * 委托指向匿名方法
 */
Func<int, int, string> f1 = delegate (int i, int j)//string是返回值类型
{
    return $"{i}+{j}={i + j}";
};
String s = f1(1, 2);
Console.WriteLine(s);
       1.2Lambda的使用

        用Lambda表达式进行代码简化:

//去掉delegate关键字,省略了参数的数据类型
Func<int, int, string> f1 = (i,j) =>
{
    return $"{i}+{j}={i + j}";
};

        如果=>后的表达式只有一行代码,并且方法有返回值,那么也可以省略方法体的花括号以及return关键字。

Func<int, int, string> f1 = (i,j) => $"{i}+{j}={i + j}";

简述Lambda表达式的简化规则:

        (1)如果一个方法没有返回值,并且方法体只有一行代码,那么方法体的花括号可以省略

Action<int ,string> a = (age,name) => Console.WriteLine($"年龄{age},姓名{name}");

        (2)如果方法只有一个参数,那么Lambda表达式表达式的参数括号可以省略

Func<int ,int> j = i => i * 2;

二、常用集合类的扩展方法 

        LINQ关键功能是提供集合类的扩展方法,所有实现了IEnumerable<T>接口的类都可以用这些方法。这些方法不是IEnumerable<T>中的方法,而是以扩展方法的形式存在于System.Linq命名空间的静态类。

2.1Where的使用

Where方法是用于根据条件对数据进行过滤。

如何用Where获取工资高于2500元且年龄低于35岁的员工?

IEnumerable<Employee> list1 = list.Where(e => e.Salary > 2500 && e.Age < 35);
foreach (Employee e in list1)
{
    Console.WriteLine(e);
}

        Where方法是一个Lambda表达式格式的匿名方法,方法的参数e表示当前待判断的元素值。

 2.2Count的使用

Cout方法用于获取数据条数。有两个重载方法:

        (1)没有参数的方法(获取数据条数)

        (2)Func<TSourse,bool> predicate类型参数(获取符合predicate条件的数据条数)

如何用获取工资高于5000元或者年龄低于30岁的员工? 

int count1 = list.Count(e => e.Salary > 5000 || e.Age < 30);
int count2 = list.Where(e => e.Salary > 5000 || e.Age < 30).Count();

注意:如果过滤条件返回的数据条数太多,超过int的最大范围,那么可以调用返回值是long类型的LongCount方法,用法与Count一样。

2.3Any的使用

Any方法用于判断集合中是否至少有一条满足条件的数据。返回值为bool类型。

        (1)没有参数的重载方法

        (2)Func<TSourse,bool> predicate类型参数

如何判断是否存在工资高于8000元的员工?

bool b1 = list.Any(e => e.Salary > 8000);
bool b2 = list.Where(e => e.Salary > 8000).Any();

 思考:其实是否利用Count也可以实现该功能?

        答案是肯定的,但是Any的效率会高于Count,因为Any只要找到一个符合条件的就会停止查询,所以如果只想判断数据是否存在,就使用Any方法即可。

2.4获取一组数据的方法

        在LINQ中有4组获取一条数据的方法,分别是SingleSingleOrDefaultFirstFirstOrDefault方法。这四个方法的返回值都是符合条件的一条数据,每组方法也同样有两个重载方法。下面解释下四个方法的区别:

Single:有且只有一条数据满足要求使用该方法,没有或者多于一条就会抛异常

SingleOrDefault:最多一条满足要求的数据,没有返回类型默认值,多于一条就会抛异常

First:一条或者多条数据时返回第一条数据,没有数据则抛出异常

FirstOrDefault:一条或者多条数据时返回第一条数据,没有数据返回类型默认值

 2.5排序方法

OrderBy方法可以对数据进行正向排序,OrderByDescending方法则对数据进行逆向排序。

 2.6限制结果集

限制结果集用来从集合中获取部分数据,主要用于分页查询。

        Skip(n):跳过n条数据。

        Take(n):获取n条数据。

2.7聚合函数

在LINQ中也有聚合函数,比如Max(最大值),Min(最小值),Average(平均值),Sum(总和),Count(总数)。

2.8分组 (GroupBy)

如何根据年龄分组,然后计算组内人数,平均工资?

/*
 * IGrouping是一个继承于IEnumerable的接口
 * GruopBy的返回值是IGrouping<int, Employee>类型的泛型IEnumerable
 * Key这一属性是IGrouping唯一的成员
 */
IEnumerable<IGrouping<int, Employee>> items = list.GroupBy(e => e.Age);
foreach(IGrouping<int, Employee> item in items)
{
    int age=item.Key;
    int count = item.Count();
    int maxSalary = item.Max(e => e.Salary);
    double avgSalary=item.Average(e => e.Salary);
    Console.WriteLine($"年龄{item.Key},人数{count},最高工资{maxSalary},平均工资{avgSalary}");
}

        在使用LINQ相关代码时可以考虑多使用var关键,它可以省去书写复杂变量类型的过程。编译器会根据变量上下文环境推测变量类型。

 2.9投影(Select)

Select方法用于把集合中的每一项逐项转换为另一种类型。

 Select方法中使用匿名类型

 2.10集合转换

集合操作大部分都是IEnumerable<T>类型,但是有些地方需要用数组类型或者List<T>类型的变量,我们可以用ToArrayToList方法进行转换。

Employee[] items1 = list.Where(e => e.Salary > 3000).ToArray();
List<Employee> items2 = list.Where(e => e.Salary > 3000).ToList();

 三、LINQ扩展方法之链式调用

        如何完成“获取Id>2的数据,再按照Age分组,再将分组按照Age排序,然后取出前3条,最后投影取得年龄、人数、平均工资”?

         LINQ的技术就分析就到此吧,不知道大家有没有感受到Csharp语法的优美呢?

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
清晰完整PDF版本,是我从网上买来的 共 80MB,分为7个分卷 在 CSDN 上只有我整个是清晰完整的 LINQ 高级编程 .NET 2010 SQL LINQ高级编程 2/7 原价:48.00元 作者:克莱因 译者:李宝 出版社: 清华大学出版社 出版日期: 2009年 ISBN:9787302198857 -------------------------------------------------------------------------------- 本书由数据库专家scott Klein编写,讲述了如何有效地使用LINQ来查询XML、SQL数据库、ADO.NET DataSet和其他数据源,并对此技术进行了更深入的探讨,展示LINQ够显著地改进应用程序的性能。 本书首先介绍TLINQ和Visual Studio 2008、LINQ相关的语言特性以及LINQ查询和LINQ标准查询操作符;然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解为您提供了强有力的新工具,从而使您能够轻松地扩展和访问数据库中的信息。 内容提要 --------------------------------------------------------------------------------   本书结合具体实例详述了LINQ高级编程所涉及的各个方面。共分为 LINQ概述、LINQ to XML、LINQ to SQL及附录四大部分,每一部分的各个章节结构清晰,层次明显。本书并不是对一种新技术的简单介绍,而是力求使读者通过本书的学习能够立即将LINQ应用到自己的项目开发中。 本书的内容深入浅出,循序渐进,不仅适合LINQ初学者,也可以作为数据库开发人员进阶的参考书。 目录 -------------------------------------------------------------------------------- 第Ⅰ部分 LINQ项目简介  第1章 LINQ项目   1.1 LINQ概述   1.2 标准查询操作符   1.3 LINQ to XML概述   1.4 LINQto SQL概述   1.5 本章小结  第2章 Visual Studio 2008简介   2.1 Visual Studi0 2008   2.2 语言相关的LINQ特性   2.3 本章小结  第3章 LINQ查询   3.1 LrNQ查询简介   3.2 查询语法和方法语法的区别   3.3 使用查询语法和方法语法   3.4 本章小结  第4章 LINQ标准查询操作符   4.1 概述   4.2 标准查询操作符   4.3 使用查询操作符   4.4 本章小结 第Ⅱ部分 LINQ to XML  第5章 理解LINQ to XML   5.1 L]NQ t0XML概述   5.2 LrNQ to XML编程基础   5.3 LINQ to XML编程概念   5.4 LINQtoXML与其他XML技术的比较   5.5 本章小结  第6章 LINQ to XML编程  第7章 LINQ to XML和其他LINQ  第8章 LINQ to XML编程高级  第9章 LINQ to XML和Visual Basic.NET 第Ⅲ部分 LINQ to SQL  第10章 LINQ to SQL概述  第11章 LINQ to SQL查询  第12章 高级查询概念  第13章 实体类  第14章 LINQ to DataSet  第15章 LINQ to SQL高级论题 第Ⅳ部分 附录 作者介绍 -------------------------------------------------------------------------------- SCott K Jein,数据库专家、资深顾问,他对SQL Server、.NET和XML都有着浓厚的兴趣。除本书外,他的著作还包括Professional SQL Server 2005 XML和Professiona/WCF Programming(本书已由清华大华出版社引进并出版,中文版书名为《WCF高级编程》)。除了出版图书之外,Scott Klein还为SOL PASS Community Connector撰写半月刊专题文章,并经常在Wrox网站(www.Wrox.corn)和TopXML网站(www.TopXML.com)上发表文章,在SQL Server和.NET用户群里发言。您可以通过ScottKlein@SalXml.com与他交流。 文摘 -------------------------------------------------------------------------------- 第Ⅰ部分 LINQ项目简介 第1章 LINQ项目 我经常听说这样的问题,“什么是LINQ?”,“它是用来做什么的?”,“我们为什么需要它?”。第一个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是一系列标准查询操作符的集合,这些操作符几乎对每一种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。LINQ可查询的数据源包括XML(可使用LINQ to XML,即原来的XLINQ)、关系数据(使用LINQ to SQL,即先前的DLINQ)、AD0.NET DataSets(使用LINQ to DataSet),以及内存中的数据。 理解这项奇妙的新技术的最好方法就是了解一些关于LINQ如何出现以及为什么出现的历史和背景。 虽然人们最早听说LINQ是在2005年秋季,但实际上2003年初微软就启动了LINQ开发LINQ的总体目标是使开发人员更容易地处理SQL和XML数据,这主要是因为在关系数据(数据库)及与其通信(即对关系数据进行处理)的编程语言之间没有任何联系,对于XML同样也是如此。 大多数开发人员现在都能理解面向对象(object.oriented,OO)编程及其相关技术和特性,如类、方法、对象等。面向对象编程在过去十多年就已有巨大的发展,但即使在当前,如果要操纵的信息不是使用00方式定义的或本身就不具有00特性,通过O0技术使用和整合这些信息时仍然存在难以逾越的鸿沟。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.net开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值