一,Lambda表达式
lambda表达式刚开始用的时候还很不习惯,因为以前用惯了那种先foreach,再逐个判断的麻烦形式,刚开始用lambda都会在脑子里转一下,变成自己让自己舒服的格式,但是写过几行代码后,就会喜欢上这种形式,首先,它比较简洁,其次,和LINQ组合起来用感觉非常贴近SQL;
二,LINQ高级查询内容简介
LINQ的写法有两种,一种是语句形式,一种是方法形式,但是语句形式支持的功能貌似不足方法强大,所以,有些时候写语句形式的LINQ表达式还要加入方法。在编译的时候,也是将语句先变成方法进行编译的。
基础的LINQ语句就向像SQL中的但关键字,但是在Linq中,select,where...这些都可以单独使用,不像SQL语句中的SQL表达式那样,比如选择的时候,有了where条件就一定要有select那样;
LINQ的高级部分可以理解成SQL的函数,依靠各种功能强大的函数来实现各种功能;
来点儿例子吧,大家可以粘到VS里面F5下看看效果:
<span style="font-size:14px;">//分组 private void btnSort_Click(object sender, EventArgs e) { List<string> persons = new List<string>(); persons.Add("l hc"); persons.Add("c hr"); persons.Add("j ay"); persons.Add("l ll"); persons.Add("d mr"); ////示例1:输出persons中所有的元素 //var result = persons.Select(p => p); //label1.Text = result.Print(); //where查询示例2:选择以l开头的字符 //方式一:var result = persons.Where(p => p.StartsWith("l")); //方式二:var result = persons.Select(p => p).Where(p => p.StartsWith("l")); //var result = persons.Where(p => p.StartsWith("l")); // var result = persons.Where(p => p.StartsWith("l")).Select(p => p); //示例3:orderby -----排序示例 //var result = persons.OrderBy(p => p); //按照字符最后一个字母排序 // var result = persons.OrderBy(p => p.Substring(p.Length - 1, 1)); //示例4:groupby //var result = persons.GroupBy(p => p.Split(new char[]{' '})[0]);//取出姓名中的空格前的部分 //foreach (var group in result ) //{ // // Console.WriteLine("姓" + group.Key); // label1.Text = label1.Text + "姓" + group.Key+":"; //key是分组依据: // foreach (var name in group)//对组内的元素进行遍历(这里是分组遍历) // { // // Console.WriteLine("/t" + name); // label1.Text = label1.Text + name + ";"; // } //} ////体验查询时机 ////当返回值为单值时马上执行语句,否则延迟执行 //var result = persons.Select(p => p).Count(); //执行完此句之后,发现result=5 //label1.Text = result.ToString(); } //查询语句部分---------------------- private void button1_Click(object sender, EventArgs e) { List<string> persons = new List<string>(); persons.Add("l hc"); persons.Add("c hr"); persons.Add("j ay"); persons.Add("l ll"); persons.Add("d mr"); ////示例一:输出persons中所有的元素 //var result = from p in persons select p; //label1 .Text = result.Print(); ////输出persons中姓l的人---语句和方法的混合编排 //var result = (from p in persons select p).Where(p => p.StartsWith("l")); //label1.Text = result.Print(); ////排序 //var result = from p in persons orderby p select p; //label1.Text = result.Print(); } //高级查询方法示例------------------ private void button2_Click(object sender, EventArgs e) { int [] arr={23,45,23,23,6,3456,34,52}; // //示例一:聚合类 //label1.Text =arr.Max().ToString (); // label1 .Text =arr.Min ().ToString (); // label1.Text =arr.Count().ToString(); // label1.Text = arr.Average().ToString(); // label1.Text = arr.Sum().ToString(); //排序类----- //var result = arr.OrderBy(p => p.ToString().Substring(0, 1));//根据开头进行排序 //var result = arr.OrderBy(p => p.ToString().Substring(0, 1)).ThenBy (p=>p); //2次排序 //var t = arr.OrderBy(p => p.ToString().Substring(0, 1)); //var result = from p in t orderby p descending select p; //分区类-----:take ;takewhile;skip;skipwhile ////skip是跳过几个,take是取几个 // var result = arr.Skip(3).Take(3);//跳过3个取3个 // label1.Text = result.Print(); ////skipwhile // var result = arr.SkipWhile(p => p > 4);//方法体部分是该linq语句不再往后执行的条件:一旦有条件满足后面的就不再判断;当第一次遇到条件成立时,去剩下的所有数据; // //takewhile //var result = arr.TakeWhile(p => p > 4);//方法部分是该linq语句提取数据的条件,当第一次遇到条件不成立的情况就停止执行; //label1.Text = result.Print(); // //集合类 //var result = arr.Distinct();//重复的部分会被去掉 //生成类----静态方法(System.Linq.Enumerable.Range:生成连续的序列) //var result = System.Linq.Enumerable.Range(10,50); //生成一连续的值:从10开始产生一个连续的值(此处产生了10到59) //var result = System.Linq.Enumerable.Range('a', 50);//字符会转成相应的ascii码 //label1 .Text = result.Print().ToString (); //生成重复序列(System.Linq.Enumerable.Repeat) //var result = System.Linq.Enumerable.Repeat(50, 10);//把50打印10次 //var result = System.Linq.Enumerable.Repeat(DateTime.Now, 10);//将现在日期时间打印 //label1.Text = result.Print().ToString();</span> <span style="font-size:14px;"> } private void button3_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.Show(); } } } public static class ExtraClass //扩展方法 { public static string Print(this IEnumerable<DateTime > ie) { //获取可遍历的接口 IEnumerator<DateTime > result = ie.GetEnumerator(); string r = ""; while (result.MoveNext()) { r = r + result.Current.ToString ()+";"; } return r; } }</span>
三,延迟加载
自从开始学习BS依赖,碰到过两个有延迟加载的东西,一个是EF,另一个就是LINQ了。先解释下什么是延迟加载:通俗点儿说,就是到真正需要数据的时候采取取数据,就像是有拖延症的朋友,不到了最后关头绝不行动。但是与拖延症相比,感觉延迟加载带来了很多好处:比如,避免了无效的占用,节省资源等。
小结:LINQ解决了对对象集合的查询,使得原来对对象的遍历判断变成了非常简洁的直接查询操作,感觉so cool ~~~~