LINQ介绍
LINQ(Language Integrated Query )语言集成查询,是一组用于C#和VB语言的拓展,它允许VB或者C#代码以操作内存数据的方式,查询数据库。简单的来说就是类似数据库(sql)的查询语句。
前期准备工作
首先定义两个类,方便后续操作
class Skip
{
public int id;
public string skip;
public int power;
public override string ToString()
{
return string.Format("id:{0},skip:{1},power:{2}", id, skip, power);
}
}
class Cat
{
public string name;
public int id;
public string skip;
public int level;
public override string ToString()
{
return string.Format("id:{0},name:{1},skip:{2},level:{3}", id, name, skip, level);
}
}
接下来添加数据
var catList = new List<Cat>
{
new Cat(){id=1,name="a",skip= "zhua",level = 10 },
new Cat(){id=5,name="b",skip= "nao",level = 1 },
new Cat(){id=6,name="c",skip= "tian",level = 11 },
new Cat(){id=3,name="d",skip= "zhua",level = 2 },
new Cat(){id=4,name="e",skip= "da",level = 7 },
new Cat(){id=2,name="f",skip= "nao",level = 6 }
};
var skipList = new List<Skip>
{
new Skip(){id=1,skip="zhua",power=100 },
new Skip(){id=2,skip="nao",power=10 },
new Skip(){id=3,skip="da",power=30 },
new Skip(){id=4,skip="tian",power=90 },
};
前期准备工作完成,进入语句学习
查询语句
- 普通查询
采用类似sql的from,where,select语句。
//1.LINQ查询语句
var res = from c in catList
where c.level > 2
select c;
foreach (var temp in res)
{
Console.WriteLine(temp);
}
Console.ReadKey();
输出结果:
扩展方法:对语句的一种简写,使用已经定义好的函数。
var res = catList.Where(m => m.level > 2);
得到的结果是一样的
从图中可以看到,List本身有Where查询函数,其传入的参数为一个委托(委托参数为Cat类型,返回值为bool类型),返回一个集合。
- 联合查询
联合查询类似表与表的全连接。
var res = from c in catList
from s in skipList
where c.skip==s.skip && s.power>20
select new {cat=c,skip=s};
扩展方法:
var res = catList.SelectMany(s => skipList, (c, s) => new { cat = c, skip = s }).Where(x=>x.cat.skip==x.skip.skip && x.skip.power>20);
其实看起来扩展方法是方便了一些,但直观性没有LINQ语句来的好,看个人喜好使用。
Join in关键字进行联合查询:
var res = from c in catList
join s in skipList on c.skip equals s.skip
select new { cat = c, skip = s };
- 对查询的结果进行排序
使用orderby关键字进行排序,descending为逆序,正序则删除
var res = from c in catList
from s in skipList
where c.skip == s.skip && s.power > 20
orderby s.power,c.id descending
select new { cat = c, skip = s };
如果排序字段相同,则可以基于前面的排序结果添加新的排序条件。
扩展方法:
var res = catList.Where(c => c.level > 2).OrderBy(s => s.level);
//如果排序字段相同的情况下
var res = catList.Where(c => c.level > 2).OrderBy(c => c.level).ThenBy(c => c.id);
- 对查询结果进行分组
使用into关键字
var res = from s in skipList
join c in catList on s.skip equals c.skip
into groups
select new { skip = s,count= groups.Count()};
使用group by关键字(根据自身分组)
var res = from c in catList
group c by c.skip
into groups
select new {count= groups.Count(),key=groups.Key};
总结
先到这,以后如果学习到其他语句,会继续添加