LINQ
感觉实质和SQL语法相同
基本数据:(数据瞎写的!!!)
var masterList = new List<MartialArtsMaster>()
{
new MartialArtsMaster(){Id = 1,Name = "黄蓉",Age = 18,Menpai = "丐帮",Kongfu = "打狗棍法",Level = 9},
new MartialArtsMaster(){Id = 2,Name = "洪七公",Age = 70,Menpai = "丐帮",Kongfu = "葵花宝典",Level = 7},
new MartialArtsMaster(){Id = 3,Name = "任我行",Age = 23,Menpai = "丐帮",Kongfu = "葵花宝典",Level = 5},
new MartialArtsMaster(){Id = 4,Name = "东方不败",Age = 45,Menpai = "明教",Kongfu = "打狗棍法",Level = 10},
new MartialArtsMaster(){Id = 5,Name = "林平之",Age = 18,Menpai = "明教",Kongfu = "无痕剑意",Level = 10},
new MartialArtsMaster(){Id = 6,Name = "岳不群",Age = 65,Menpai = "明教",Kongfu = "九阴真经",Level = 9},
new MartialArtsMaster(){Id = 7,Name = "令狐冲",Age = 65,Menpai = "华山",Kongfu = "独孤九剑",Level = 8},
new MartialArtsMaster(){Id = 8,Name = "梅超风",Age = 23,Menpai = "华山",Kongfu = "弹指神功",Level = 6},
new MartialArtsMaster(){Id = 9,Name = "郭靖",Age = 45,Menpai = "桃花岛",Kongfu = "降龙十八掌",Level = 7},
new MartialArtsMaster(){Id = 10,Name = "黄药师",Age = 77,Menpai = "桃花岛",Kongfu = "打狗棍法",Level = 9},
};
var kongfu = new List<Kongfu>()
{
new Kongfu(){Id = 1,Name = "打狗棍法",Power = 90},
new Kongfu(){Id = 2,Name = "葵花宝典",Power = 96},
new Kongfu(){Id = 3,Name = "无痕剑意",Power = 100},
new Kongfu(){Id = 4,Name = "九阴真经",Power = 90},
new Kongfu(){Id = 5,Name = "独孤九剑",Power = 95},
new Kongfu(){Id = 6,Name = "弹指神功",Power = 85},
new Kongfu(){Id = 7,Name = "降龙十八掌",Power = 100},
};
单条件查询
LINQ表达式写法
查询所有武学级别大于8的宗师
var res = from m in masterList
where m.Level > 8
select m;
扩展方法写法
查询所有武学级别大于8的宗师
// 刚刚有点懵 前面的Func有点忘了 摸出来的,new 委托类型(方法)
var res = masterList.Where(new Func<MartialArtsMaster, bool>((master => master.Level > 8)));
// 直接Lambda表达式
var res = masterList.Where(r => r.Level > 8)
多条件查询
LINQ表达式写法
查询所有武学级别大于8,门派是丐帮的宗师
var res = from m in masterList
where m.Level > 8 && m.Menpai=="丐帮"
select m;
扩展方法写法
查询所有武学级别大于8,门派是丐帮的宗师
var res = masterList.Where(new Func<MartialArtsMaster, bool>((master => master.Level > 8 && master.Menpai=="丐帮")));
// 直接Lambda表达式
var res = masterList.Where(r => r.Level > 8 && master.Menpai=="丐帮")
多表查询
LINQ表达式写法
var res = from m in masterList
from k in kongfu
select new {master = m,kongfu = k};
会把两个集合的对象一一对应组和
添加联合条件:
var res = from m in masterList
from k in kongfu
where m.Kongfu == k.Name
select new {master = m,kongfu = k};
查询所学武学杀伤力大于90的宗师
var res = from m in masterList
from k in kongfu
where m.Kongfu == k.Name && k.Power>90
select new {master = m,kongfu = k};
扩展方法写法
把两个集合的对象一一对应组和
var res = masterList.SelectMany(k=>kongfuList,(m,k)=>new {master=m,kongfu=k});
添加限制条件,相当于指定外键(修炼功夫的名字)
var res = masterList.SelectMany(k => kongfuList, (m, k) => new {master = m, kongfu = k}).Where(x =>x.master.Kongfu == x.kongfu.Name);
查询所学武学杀伤力大于90的宗师
var res = masterList.SelectMany(k => kongfuList, (m, k) => new {master = m, kongfu = k}).Where(x =>x.master.Kongfu == x.kongfu.Name && x.kongfu.Power> 90);
排序
LINQ表达式写法
根据年龄排序,规则同SQL
// 正序
var res = from m in masterList
where m.Level > 6 && m.Menpai == "丐帮"
orderby m.Age
select m;
// 倒序
var res = from m in masterList
where m.Level > 6 && m.Menpai == "丐帮"
orderby m.Age descending
select m;
// 多个排序
var res = from m in masterList
where m.Level > 6 && m.Menpai == "丐帮"
orderby m.Age,m.Level
select m;
扩展方法用法
二次排序要用ThenBy、ThenByDescending(倒序)
var res = masterList.Where(m => m.Level > 6).OrderBy(r => r.Age).ThenByDescending(r => r.Level);
联合查询
通过一个键连接两个集合
var res = from m in masterList
join k in kongfuList on m.Kongfu equals k.Name
select new {master = m, kongfu = k};
结果
分组
into groups
接后面?
var res = from k in kongfuList
join m in masterList on k.Name equals m.Kongfu
into groups
orderby groups.Count()
select new {kongfu = k, count = groups.Count()};
结果:
group by
通过门派分组
var res = from m in masterList
group m by m.Menpai
into g
select new {count=g.Count(),key = g.Key}; // g.Key Key表示是按照哪个属性分的组
结果:
量词操作符
Any
一个满足条件
判断宗师集合中有没有丐帮的人
masterList.Any(m => m.Menpai == "丐帮");
All
全部满足条件
masterList.All(m => m.Menpai == "丐帮")