前面的章节细致介绍了LINQ扩展包的具体方法使用,本篇则是演示LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
对集合的增删改查
Linq是对集合进行操作,这里列举对集合增删改查的常用方法。在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,创建Salary对象和包含Salary对象的集合,作为后面查询和输出的数据源,参见这篇文章C#进阶之LINQ表达式总结完成准备工作。
数据源1:
数据源2:
一、新增集合内对象
/* 新增一个任意属性的用户到集合 *//* C#版本1 */UseruserAdd=newUser() { id=11, name="Liu Mingxiu", age=22, gender=false, occupation="Doctor"}; list.Add(userAdd); /* C#版本2(支持一次添加多个) */IEnumerable<User>userAddList=newList<User>().Append(userAdd); list.AddRange(userAddList);
/* 输出结果 */{id=1, name=ZhangLong, age=38, gender=True, occupation=Teacher}, {id=2, name=ZhangJin, age=18, gender=False, occupation=Student}, {id=3, name=ZhangShuai, age=38, gender=False, occupation=Teacher}, {id=4, name=LiuGuangzhi, age=38, gender=False, occupation=Doctor}, {id=5, name=LiuZiming, age=38, gender=True, occupation=Doctor}, {id=6, name=LiuShuai, age=29, gender=False, occupation=Doctor}, {id=7, name=LiuJin, age=21, gender=True, occupation=Builder}, {id=8, name=JiangLong, age=38, gender=True, occupation=Builder}, {id=9, name=HuZiming, age=21, gender=True, occupation=Student}, {id=10, name=HuJin, age=21, gender=False, occupation=Student}, {id=11, name=LiuMingxiu, age=22, gender=False, occupation=Doctor}
二、更新集合内的指定对象属性
/* 修改集合内所有医生的工资为10000且在职 *//* C#版本1 使用ForEach方法 */salaryList.Where(item=>item.occupation=="Doctor").ToList() .ForEach(u=> { u.salary=10000; u.active=true; }); /* C#版本2 使用All方法(需要返回true) */salaryList.Where(item=>item.occupation=="Doctor").ToList() .All( u=> { u.salary=10000; u.active=true; returntrue; });
/* 输出结果 */{id=1, name=ZhangLong, occupation=Teacher, active=True, salary=7800} {id=2, name=ZhangJin, occupation=Student, active=True, salary=1500} {id=3, name=ZhangShuai, occupation=Teacher, active=False, salary=8800} {id=4, name=LiuGuangzhi, occupation=Doctor, active=True, salary=10000} {id=5, name=LiuZiming, occupation=Doctor, active=True, salary=10000} {id=6, name=LiuShuai, occupation=Doctor, active=True, salary=10000} {id=7, name=LiuJin, occupation=Builder, active=True, salary=7000} {id=8, name=JiangLong, occupation=Builder, active=False, salary=8500} {id=9, name=HuZiming, occupation=Student, active=True, salary=2100} {id=10, name=HuJin, occupation=Student, active=True, salary=1300}
三、删除集合内指定对象
/* 删除集合内所有职业为医生的用户对象 *//* 推荐使用RemoveAll方法批量删除 *//* C#版本1 */list.RemoveAll(item=>item.occupation=="Doctor"); /* 也可以使用Remove方法单个删除 *//* C#版本2 */List<User>maps=list.Where(item=>item.occupation=="Doctor").ToList(); foreach (UseruserDeleteinmaps){ list.Remove(userDelete); } /* C#版本3 */List<User>maps= (fromuinlistwhereu.occupation=="Doctor"selectu).ToList(); foreach (UseruserDeleteinmaps){ list.Remove(userDelete); }
/* 输出结果 */{id=1, name=ZhangLong, age=38, gender=True, occupation=Teacher}, {id=2, name=ZhangJin, age=18, gender=False, occupation=Student}, {id=3, name=ZhangShuai, age=38, gender=False, occupation=Teacher}, {id=7, name=LiuJin, age=21, gender=True, occupation=Builder}, {id=8, name=JiangLong, age=38, gender=True, occupation=Builder}, {id=9, name=HuZiming, age=21, gender=True, occupation=Student}, {id=10, name=HuJin, age=21, gender=False, occupation=Student}
四、查询集合内的对象
基础查询参考:C#进阶-LINQ表达式基础语法Ⅰ、C#进阶-LINQ表达式基础语法Ⅱ;
多表查询参考:多表查询 Ⅰ(交集、并集、差集、去重)、多表查询 Ⅱ(Join连接查询);
分组查询参考:分组查询 (GroupBy);