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

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

基础语法Ⅰ

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

数据源:

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

① Select 查询

/* SQL里的表达: 查找用户里职业是医生的人的姓名,按照年龄倒序输出 */
select name from user where occupation = "Doctor" order by age desc;
/* 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表达式基础语法Ⅰ
Liu Guangzhi, Liu Ziming, Liu Shuai /* 输出结果 */

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


② Count 计数

/* SQL里的表达: 查找用户里姓Zhang的女性教师的数量*/
select count(*) from user where occupation = "Teacher" and name like 'Zhang%' and gender = false;
/* 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表达式基础语法Ⅰ
1 /* 输出结果 */

③ Average 平均值

/* SQL里的表达: 查找用户里姓Liu的小于40岁的医生的平均年龄 */
select avg(age) from user where occupation = "Doctor" and name like 'Liu%' and age < 40;
/* 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表达式基础语法Ⅰ
35 /* 输出结果 */

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

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


⑤ OrderBy 排序

/* SQL里的表达: 查找用户里名字带Jin的人,优先按照年龄倒序,其次按照姓氏拼音正序,输出这些人的全部信息 */
select * from user where name like '%Jin%' order by  age desc name asc;
/* 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表达式基础语法Ⅰ
{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} /* 输出结果 */
此条目发表在ASP.NET, C#分类目录,贴了, , , , , 标签。将固定链接加入收藏夹。

发表回复