C# Lambda和Linq的簡單運用
阿新 • • 發佈:2020-12-08
簡單地記錄一下Lambda和Linq的常見用法。下面用幾個簡單例子來展示。
準備測試資料
public class User { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public int Money { get; set; } public int RoleID { get; set; } public Role Role { get; set; } } public class Role {public int ID { get; set; } public string Name { get; set; } } List<User> list = new List<User>(); list.Add(new() { ID = 1, Name = "張三", Age = 15, Money = 100, RoleID = 1 }); list.Add(new() { ID = 2, Name = "李四", Age = 16, Money = 200, RoleID = 1 }); list.Add(new() { ID = 3, Name = "王五", Age = 17, Money = 400, RoleID = 2 }); list.Add(new() { ID = 4, Name = "宋六", Age = 17, Money = 250, RoleID = 2 }); list.Add(new() { ID = 5, Name = "龍七", Age = 17, Money = 250, RoleID = 2 }); List<Role> roleList = new List<Role>(); roleList.Add(new() { ID = 1, Name = "普通使用者" }); roleList.Add(new() { ID = 2, Name = "超級使用者" });
一般查詢
//linq
var ddd = from a in list select a;
//lambda var ddd2 = list;
//sql string sql = "select * from user";
帶where查詢
//linq var ddd = from a in list where a.Age > 15 select a; //lambda var ddd2 = list.Where(x => x.Age > 15); //sql string sql = "select * from user where age>15";
簡單的函式計算(max、min、count、sum)
//linq ////獲取最大的年齡 //var ddd = (from a in list // select a).Max(x => x.Age); ////獲取最小的年齡 //var ddd = (from a in list // select a).Min(x => x.Age); ////獲取總數 //var ddd = (from a in list // select a).Count(); //獲取總和 var ddd = (from a in list select a).Sum(x => x.Age); //lambda //var ddd2 = list.Max(x=>x.Age); //var ddd2 = list.Min(x => x.Age); //var ddd2 = list.Count(); var ddd2 = list.Sum(x => x.Age); //sql //string sql = "select max(age) from user"; //string sql = "select min(age) from user"; //string sql = "select count(1) from user"; string sql = "select sum(age) from user";
排序
//linq ////正序 //var ddd = from a in list // orderby a.Age ascending // select a; //倒序 var ddd = from a in list orderby a.Age descending select a; //lambda ////正序 //var ddd2 = list.OrderBy(x => x.Age); //倒序 var ddd2 = list.OrderByDescending(x => x.Age); //sql ////正序 //string sql = "select * from user order by age"; //倒序 string sql = "select * from user order by age desc";
top 1
//linq var ddd = (from a in list select a).FirstOrDefault(); //lambda var ddd2 = list.FirstOrDefault(); //sql string sql = "select top 1 from user";
跳過前面多少條資料,取剩下的資料
//linq var ddd = (from a in list orderby a.Age descending select a).Skip(1);//跳過第一條 //lambda var ddd2 = list.OrderByDescending(x => x.Age).Skip(1);//跳過第一條 //sql string sql = "select * from (select ROW_NUMBER() over(order by age desc) as rowNum,* from user) t where rowNum>1";
分頁查詢
//linq var ddd = (from a in list orderby a.Age descending select a).Skip(1).Take(3);//跳過第一條,取兩條,即取第二條到第四條 //lambda var ddd2 = list.OrderByDescending(x => x.Age).Skip(1).Take(3);//跳過第一條,取兩條,即取第二條到第四條 //sql string sql = "select * from (select ROW_NUMBER() over(order by age desc) as rowNum,* from user) t where rowNum>1 and rowNum<=4";
包含,相當於like
//linq var ddd = from a in list where a.Name.Contains("李") select a; //lambda var ddd2 = list.Where(x=>x.Name.Contains("李")); //sql string sql = "select * from user where name like '%李%'";
分組groupby
//linq ////寫法一 //var ddd = from a in list // group a by a.Age into n // select n; //foreach (var t in ddd) //{ // Console.WriteLine("min:" + t.Key + "--" + t.Min(p => p.Money)); // Console.WriteLine("max:" + t.Key + "--" + t.max(p => p.Money)); //} //寫法二 var ddd = from a in list group a by a.Age into n select new { n.Key, minMoney = n.Min(x => x.Money), maxMoney = n.Max(x => x.Money) }; foreach (var t in ddd) { Console.WriteLine("min:" + t.Key + "--" + t.minMoney); Console.WriteLine("max:" + t.Key + "--" + t.maxMoney); } //lambda var ddd2 = list.GroupBy(x => x.Age); foreach (var t in ddd2) { Console.WriteLine(t.Key + "--" + t.Min(p => p.Money)); } //sql string sql = "select age,min(money),max(money),sum(money) from user group by age"; ///////////////////多欄位 //linq var ddd = from a in list group a by new { a.Age,a.Money} into n select new { n.Key.Age, n.Key.Money, count = n.Count() }; //lambda var ddd2 = list.GroupBy(x => new { x.Age, x.Money }).Select(x => new { x.Key.Age, x.Key.Money, count = x.Count() }); //sql string sql = "select age,money from user group by age,money";
連表查詢
//linq var ddd = from a in list join b in roleList on a.RoleID equals b.ID select new User { ID = a.ID, Name = a.Name, Age = a.Age, Money = a.Money, RoleID = a.RoleID, Role = b }; //lambda var ddd2 = list.Join(roleList,//主表 a => a.RoleID, //主表join值 b => b.ID, //次表join值 (a, b) => new User {//主表次表資料整合 ID = a.ID, Name = a.Name, Age = a.Age, Money = a.Money, RoleID = a.RoleID, Role = b }); //sql string sql = "select * from user a left join roleList on a.roleID = b.id";
sql中的in
//linq var ddd = from a in list where (new int[] { 15, 16 }).Contains(a.Age) select a; //lambda var ddd2 = list.Where(x=>(new int[] { 15, 16 }).Contains(x.Age)); //sql string sql = "select * from user where age in (15,16)";
總結
掌握上面這幾個基礎的linq和lambda使用,基本就能解決大部分查詢問題。