Linq——高级查询方法入门

 

          一,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 ~~~~

           

          

     

   

时间: 2024-11-02 08:42:32

Linq——高级查询方法入门的相关文章

LinQ To Objects 高级查询方法

 什么是LinQ To Objects?      用一个例子解释,首先定义一个数组,查询数组中的最大值:   int[] arr = { 123, 2, 3, 45, 654, 2324, 897, 56, 6554, 4, 3, 6, 8, 434 };      旧的方法:    int max=0 ; foreach(int a in arr) { if(a>=max) max=a; } Console.Write("最大值:"+ max);           LinQ

linq 查询 Linq 高级查询实例代码_实用技巧

复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text.RegularExpressions; using System.IO; using System.Text; using System.Data; namespa

Linq入门——什么是linq &amp;amp; 扩展方法

 一,什么是Linq                      linq(language integrated Query):语言集成查询:      linq包含如下:                 对对象的查询,对数据库的查询,对XML的查询.       那么,没有linq前我们是怎样查询的?             先看一个例子:             现在我们要查询大于50的数,:          在没有linq之前,我们的代码时这样的:                   

NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询

相关文章:NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询 系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHiber

NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询

相关文章:NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询 系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHiber

Linq之扩展方法

目录 写在前面 系列文章 扩展方法 总结 写在前面 上篇文章介绍了隐式类型,自动属性,初始化器,匿名类的相关概念,及通过反编译的方式查看了编译器帮我们做了那些事.本篇文章将介绍扩展方法的知识点,及如何定义,如何使用的相关内容. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类 扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法

LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用

问题描述 延迟执行的经典例子:我们用select++i就可以看到在foreach时候,查询才被执行.publicstaticvoidLinq99(){int[]numbers=newint[]{5,4,1,3,9,8,6,7,2,0};inti=0;varq=fromninnumbersselect++i;foreach(varvinq)Console.WriteLine("v={0},i={1}",v,i);}输出结果:v=1,i=1v=2,i=2v=3,i=3v=4,i=4v=5,