前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#进阶-LINQ表达式基础语法Ⅰ

C#进阶-LINQ表达式基础语法Ⅰ

作者头像
Damon小智
发布2024-02-03 10:31:35
2260
发布2024-02-03 10:31:35
举报
文章被收录于专栏:全栈文档库

本篇文章我们将演示LINQ扩展包的基础语法,以Select查询、Count计数、Average平均值、OrderBy排序函数为例,目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。

基础语法Ⅰ

在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,作为后面查询和输出的数据源,参见这篇文章C#进阶之LINQ表达式总结完成准备工作。

数据源:

linq002 1 - C#进阶-LINQ表达式基础语法Ⅰ
linq002 1 - C#进阶-LINQ表达式基础语法Ⅰ

① Select 查询

代码语言:javascript
复制
/* SQL里的表达: 查找用户里职业是医生的人的姓名,按照年龄倒序输出 */
select name from user where occupation = "Doctor" order by age desc;
代码语言:javascript
复制
/* C#版本1 */
List<string> nameList = (from u in list where u.occupation == "Doctor" orderby u.age descending select u.name).ToList();
/* C#版本2 */
List<string> nameList = list.OrderByDescending(u => u.age).Where(p => p.occupation == "Doctor").Select(x => x.name).ToList();
CKT5VEQ3TLIX0X9R - C#进阶-LINQ表达式基础语法Ⅰ
CKT5VEQ3TLIX0X9R - C#进阶-LINQ表达式基础语法Ⅰ
代码语言:javascript
复制
Liu Guangzhi, Liu Ziming, Liu Shuai /* 输出结果 */

其中,C#版本1的语法是 from 变量名 in 集合 where 条件 orderby 条件 select 结果变量,得到的结果是LINQ的内置类型<Enumerable>,可直接视为匿名类型(var),需用.ToList()转换为List<string>类型。C#版本2是LINQ的一种扩展写法,是更加常用的写法。


② Count 计数

代码语言:javascript
复制
/* SQL里的表达: 查找用户里姓Zhang的女性教师的数量*/
select count(*) from user where occupation = "Teacher" and name like 'Zhang%' and gender = false;
代码语言:javascript
复制
/* C#版本1 */
int count = (from u in list where u.occupation == "Teacher" where !u.gender where u.name.StartsWith("Zhang") select u).Count();
/* C#版本2 */
int count = list.Count(u => u.occupation == "Teacher" && !u.gender && u.name.StartsWith("Zhang"));
linq003 - C#进阶-LINQ表达式基础语法Ⅰ
linq003 - C#进阶-LINQ表达式基础语法Ⅰ
代码语言:javascript
复制
1 /* 输出结果 */

③ Average 平均值

代码语言:javascript
复制
/* SQL里的表达: 查找用户里姓Liu的小于40岁的医生的平均年龄 */
select avg(age) from user where occupation = "Doctor" and name like 'Liu%' and age < 40;
代码语言:javascript
复制
/* C#版本1 */
double averageNum = (from u in list where u.occupation == "Doctor" where u.age<40 where u.name.StartsWith("Liu") select u.age).Average();
/* C#版本2 */
double averageNum = list.Where(u => u.occupation == "Doctor" && u.age < 40 && u.name.StartsWith("Liu")).Select(u => u.age).Average();
linq004 - C#进阶-LINQ表达式基础语法Ⅰ
linq004 - C#进阶-LINQ表达式基础语法Ⅰ
代码语言:javascript
复制
35 /* 输出结果 */

④ Max/Min/Sum/ 最大/小值/总和

这里仅需参考LINQ求平均值的例子,求最大/小值或者总和时,只需要把C#语句末尾的.Average()方法替换成.Max()/.Min()/.Sum()即可。


⑤ OrderBy 排序

代码语言:javascript
复制
/* SQL里的表达: 查找用户里名字带Jin的人,优先按照年龄倒序,其次按照姓氏拼音正序,输出这些人的全部信息 */
select * from user where name like '%Jin%' order by  age desc name asc;
代码语言:javascript
复制
/* C#版本1 */

List<User> userList = (from u in list where u.name.Contains("Jin") orderby u.age descending orderby u.name select u).ToList();
/* C#版本2 */

List<User> userList = list.Where(u => u.name.Contains("Jin")).OrderByDescending(u => u.age).OrderBy(u => u.name).ToList();
linq005 - C#进阶-LINQ表达式基础语法Ⅰ
linq005 - C#进阶-LINQ表达式基础语法Ⅰ
代码语言:javascript
复制
{id = 10, name = Hu Jin, age = 21, gender = False, occupation = Student}, 
{id = 7, name = Liu Jin, age = 21, gender = True, occupation = Builder}, 
{id = 2, name = Zhang Jin, age = 18, gender = False, occupation = Student} /* 输出结果 */

Damon_Liu

Damon, Chinese, Liu Guangzhi, Software development engineer, CSDN quality creator, Ali Cloud expert blogger, Microsoft Technology Associate, Good at C#, Java, PHP, Python, etc, Love sports, Workaholic, Communist.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础语法Ⅰ
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档