LINQ(Language Integrated Query) 语言集成查询,是 .net 框架的扩展,它允许我们用 SQL 查询数据库的方式来查询数据的集合
扩展方法 Select 返回指定类型
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 public class LinqTest { public void SelectTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var list1 = UserList; var list2 = UserList.Select(x => x.UserName); var list3 = UserList.Select(x => new { id = x.UserId, name = x.UserName }); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Where 查询特定条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class LinqTest { public void WhereTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var list1 = UserList.Where(x => x.Age >= 40 ); var list2 = UserList.Where(x => x.UserName = "李四" && x.PassWord = "lisi123" ); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
OfType 查询特定数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class LinqTest { public List<object > Main (string [] args ) { List<object > List = new List<object >(); List.Add(1 ); List.Add(2 ); List.Add(3 ); List.Add("4" ); List.Add("5" ); List.Add(6 ); var list = List.OfType<string >(); return list; } }
最后返回 [ “4”, “5” ]
Join 将一个集合与另一个集合通过指定键合并,返回合并后的集合
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 public class LinqTest { public void JoinTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 , RoleId = "1" }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 , RoleId = "2" }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 , RoleId = "3" }); List<RoleInfo> RoleList = new List<RoleInfo>(); RoleList.Add(new RoleInfo { RoleId = "1" , UserName = "开发人员" }); RoleList.Add(new RoleInfo { RoleId = "2" , UserName = "管理员" }); RoleList.Add(new RoleInfo { RoleId = "3" , UserName = "用户" }); var result = UserList.Join(RoleList, x => x.RoleId , p => p.RoleId, (x,p) => { id = x.UserId, name = x.UserName, pwd = x.PassWord, role = p.RoleName }); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; public string RoleId; } public class RoleInfo { public string RoleId; public string RoleName; }
GroupJoin 将一个集合与另一个集合通过指定键分组
OrderBy 对集合排序,默认是从小到大排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class LinqTest { public void OrderByTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result = UserList.OrderBy(x => x.Age); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Reverse 反转集合中元素的顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class LinqTest { public void ReverseTest () { List<string > List = new List<string >(); List.Add("1" ); List.Add("2" ); List.Add("3" ); List.Add("4" ); List.Add("5" ); List.Add("6" ); var list = personList.AsEnumerable().Reverse(); } }
GroupBy 自身分组查询
Any 和 All 判断集合中是否满足某个/条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class LinqTest { public void AnyOrAllTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result1 = UserList.Any(x => x.Age > 40 ); var result2 = UserList.All(x => x.Age > 40 ); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Any
是判断列表里是否有符合条件的元素,任意一个元素满足条件则返回true,否则返回 false
All
是判断列表里的每一个元素是否都符合条件,全部符合返回 true
有不符合的不论有几个都返回 false
Skip 跳过指定个元素查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class LinqTest { public void SkipTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result = UserList.Skip(1 ); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Take 只查询指定个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class LinqTest { public void TakeTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result = UserList.Skip(2 ); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Sum、Average、Max、Min 计算集合中指定数字类型数据的 总和、平均值、最大值、最小值
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 public class LinqTest { public void MathTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var sum = UserList.Sum(x => x.Age); var avg = UserList.Average(x => x.Age); var max = UserList.Max(x => x.Age); var min = UserList.Min(x => x.Age); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Concat 连接两个相同类型集合,合并为一个集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class LinqTest { public void ConcatTest () { List<UserInfo> UserList_1 = new List<UserInfo>(); UserList_1.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList_1.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); List<UserInfo> UserList_2 = new List<UserInfo>(); UserList_2.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result = UserList_1.Concat(UserList_2); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Distinct 从集合中去除掉重复的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class LinqTest { public void DistinctTest () { List<int > List = new List<int >(); List.Add(1 ); List.Add(1 ); List.Add(2 ); List.Add(3 ); List.Add(5 ); List.Add(5 ); List.Add(5 ); var result = List.Distinct(); } }
使用 Distinct 去重类中某个字段需要实现 IEqualityComparer 接口
ElementAt 得到集合中指定索引的元素,与[]作用相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class LinqTest { public void ElementAtTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result = UserList.ElementAt(2 ); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Count 得到集合中满足指定条件的元素个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class LinqTest { public void CountTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result1 = UserList.Count(x => x.Age >= 40 ); var result2 = UserList.Count(); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
First/Single 和 Last 得到集合中第一个/最后一个元素(如果集合中包含多个元素,使用 Single 会报错)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class LinqTest { public void FirstOrLastTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var value1 = UserList.First(x => x.Age >= 40 ); var value2 = UserList.Last(x => x.Age <= 40 ); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
Single 和 First 的区别 Single
: 确定只符合条件的结果只有一个值;否则报错,如果有多个值则报 Sequence contains more than one matching element
, 如果没有符合的则报 Sequence contains no matching element
SingleOrDefault
: 在确定的条件下,只有一个或者 0 个值;如果一个以上的值符合条件 则报错。
First
: 在确定条件下,至少有一个值;否则报 Sequence contains no matching element 错误。
FirstOrDefault
: 在确定条件下,可以有 0 个包括 0 个以上的值。
ToDictionary 将集合转换为字典
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class LinqTest { public void ToDictionaryTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var result = UserList.ToDictionary(x => x.UserId); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
ToList 将集合转换为 list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class LinqTest { public void ToDictionaryTest () { List<UserInfo> UserList = new List<UserInfo>(); UserList.Add(new UserInfo { UserId = "user001" , UserName = "张三" , PassWord = "zhangsan113" , Age = 40 }); UserList.Add(new UserInfo { UserId = "user002" , UserName = "李四" , PassWord = "lisi123" , Age = 34 }); UserList.Add(new UserInfo { UserId = "user003" , UserName = "翠花" , PassWord = "cuihua.12138" , Age = 48 }); var tmp = UserList.ToDictionary(x => x.UserId); var result = tmp.Values.ToList(); } } public class UserInfo { public string UserId; public string UserName; public string PassWord; public int Age; }
SequenceEqual 判断两个集合是否相等
1 2 3 4 5 6 7 8 9 10 11 12 13 public class LinqTest { public void SequenceEqualTest () { List<int > list1 = new List<int >() { 1 , 2 , 3 }; List<int > list2 = new List<int >() { 3 , 1 , 2 }; list1 = list1.OrderBy(temp => temp).ToList(); list2 = list2.OrderBy(temp => temp).ToList(); var result = list1.SequenceEqual(list2); } }