1.Linq操作介绍
Linq操作是C#集成的类似于数据库语言的操作,是通过将数据库的表名映射为类,把数据库的列名映射为属性。
Linq查询主要分为3类:
Linq to object(数组、list集合) --内存里面的数据
Linq to sql(查询数据库用的) --在数据库数据
Linq to XML 查询XML文件
这里主要以第一种为例,下面将会直接以代码+注释的方法来展示第一类方式如何使用linQ进行查询。为方便读者直接复制代码进行运行,就不配置数据库,使用对象的方式来存储数据。下面直接上代码:
Kongfu.cs内代码如下:
public class Kongfu
{public int Id { get; set; }public string Name { get; set; }public int Power { get; set; }public override string ToString(){return string.Format("id:{0}, name:{1}, power:{2}", Id, Name, Power);}
}
MartialArtsMaster.cs内代码如下所示:
public class MartialArtsMaster
{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Menpai { get; set; }public string Kongfu { get; set; }public int Level { get; set; }public override string ToString(){return string.Format("id:{0}, name:{1}, Age:{2}, Menpai:{3}, Kongfu:{4}, Level:{5}",Id,Name,Age,Menpai,Kongfu,Level);}
}
program.cs内代码如下所示,使用了masterList 来存储人物信息,kongFuList 来存储武学信息;
同时下面也列举了,Linq查询的表达式和扩展写法、联合查询、集合查询、排序、分组等多种查询方法。
internal class Program
{static void Main(string[] args){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=10},new MartialArtsMaster() {Id=3,Name="郭靖",Age=22,Menpai="丐帮",Kongfu="降龙十八掌",Level=10},new MartialArtsMaster() {Id=4,Name="任我行",Age=50,Menpai="明教",Kongfu="葵花宝典",Level=1},new MartialArtsMaster() {Id=5,Name="东方不败",Age=35,Menpai="明教",Kongfu="葵花宝典",Level=10},new MartialArtsMaster() {Id=6,Name="林平之",Age=23,Menpai="华山",Kongfu="葵花宝典",Level=7},new MartialArtsMaster() {Id=7,Name="令狐冲",Age=23,Menpai="华山",Kongfu="独孤九剑",Level=10},new MartialArtsMaster() {Id=8,Name="梅超风",Age=23,Menpai="桃花岛",Kongfu="九阴真经",Level=8},new MartialArtsMaster() {Id=9,Name="黄药师",Age=23,Menpai="桃花岛",Kongfu="弹指神通",Level=10}};var kongFuList = new List<Kongfu>(){//初始化功夫new Kongfu(){Id=1,Name="打狗棒法",Power=90},new Kongfu(){Id=2,Name="降龙十八掌",Power=95},new Kongfu(){Id=3,Name="葵花宝典",Power=100},new Kongfu(){Id=4,Name="独孤九剑",Power=100},new Kongfu(){Id=5,Name="九阴真经",Power=100},new Kongfu(){Id=6,Name="弹指神通",Power=100}};//var res = new List<MartialArtsMaster>();//foreach (var temp in masterList)//{// if (temp.Level > 8)// {// res.Add(temp);// }//}//(1)使用LINQ做查询(表达式写法)var res1 = from m in masterList//from 后面设置查询集合where m.Level > 8 && m.Menpai == "丐帮"//where后面跟上查询条件select m; //表示m的结果结合返回//select m.Name; //表示值只返回对象中名字集合//(2)扩展写法var res2 = masterList.Where(Test1);//过滤方法static bool Test1(MartialArtsMaster master){if (master.Level > 8){return true;}else {return false;}}//(3)扩展写法var res3 = masterList.Where(m => m.Level > 8 &&m.Menpai == "丐帮");//(4)联合查询var res4 = from m in masterListfrom k in kongFuListwhere m.Kongfu == k.Name && k.Power > 90select m;//select new { master = m, Kongfu = k };//(5)联合查询扩展 masterList.SelectMany(m => kongFuList) 表示 两个对象做联合查询var res5 = masterList.SelectMany(m => kongFuList, (m, k) => new { master = m, kongfu = k }).Where(x => x.master.Kongfu == x.kongfu.Name && x.kongfu.Power > 90);//(6)排序var res6 = from m in masterList//from后面设置查询集合where m.Level > 8 && m.Menpai=="丐帮" //按照多个属性进行排序,如果字段属性相同,就按照第二个属性排序orderby m.Level,m.Age select m;var res7 = from m in masterList//from后面设置查询集合where m.Level > 8 && m.Menpai == "丐帮"//按照多个属性进行排序,如果字段属性相同,就按照第二个属性排序orderby m.Age descendingselect m;//使用OrderByDescending 排序var res8 = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮").OrderByDescending(m => m.Age);//ThenBy表示在前面字段相同的情况下使用某个字段排序var res9 = masterList.Where(m => m.Level > 8).OrderBy(m => m.Level).ThenBy(m => m.Age);//(7)集合联合var res10 = from m in masterListjoin k in kongFuList on m.Kongfu equals k.Nameselect new { master = m, kongfu = k };//(8)分组查询 into groups(把武林高手按照所学功夫分类,看一下那个功夫修炼的人数最多)var res11 = from k in kongFuListjoin m in masterList on k.Name equals m.Kongfuinto groupsselect new { kongfu = k, count = groups.Count()};//(9)按自身字段分组 groupvar res12 = from m in masterListgroup m by m.Menpaiinto groups//g.Key Key表示是按那个属性分的组select new { count = groups.Count(), groups.Key };//(10)量词操作符 any all 判断集合中是否满足某个条件bool res13 = masterList.Any(a => a.Menpai == "长留");Console.WriteLine("是否存在“长留”门派:{0}",res13);bool res14 = masterList.All(a => a.Menpai == "丐帮");Console.WriteLine(res14);foreach (var temp in res12){Console.WriteLine(temp);}Console.ReadKey();}}