1. 程式人生 > 實用技巧 >C# Lambda和Linq的簡單運用

C# Lambda和Linq的簡單運用

  簡單地記錄一下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使用,基本就能解決大部分查詢問題。