LinQ百度百科对她这样解释,是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。 LINQ是Language Integrated Query的简称,翻译成中文就是语言集成查询,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。她提供多种查询方法,有select,where,orderby,groupby,小伙伴们是不是觉得在哪儿见过nie,哦,在梦里,开玩笑,跟我们之前学习过的sql相似,那么她们有什么区别nie,接着小编举例说明。

比如,我们要实现从numbers数组中获取大于50的数,我们的代码是这么来写的:

<span style="font-size:18px;"><span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ch01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            int[] arr = { 123, 12, 3, 12, 15, 4, 6, 46, 48, 56, 785 };
            //获取大于50的数
            //没有LinQ我们怎么做?
            ArrayList result = new ArrayList();
            for (int i = 0; i < arr.Length;i++ )
            {
                if (arr[i]> 50)
                {
                    result.Add(arr[i]);
                }
            }
            //打印result就ok了
            for (int i = 0;i<result.Count;i++)
            {
                Console.WriteLine(result[i]);
            }
        }
    }
}
</span></span>

运行效果如下:

接着,我们来看,如果使用linq,我们的代码又该如何写nie:

<span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ch01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            int[] arr = { 123, 12, 3, 12, 15, 4, 6, 46, 48, 56, 785 };

            //有了LinQ后我们可以这么做
            //获取大于50的数
            IEnumerable ie = arr.Select(p => p).Where(p => p > 50);
            //输出--该部分代码可重用
            IEnumerator result = ie.GetEnumerator();
            while (result.MoveNext())
            {
                Console.WriteLine(result.Current);

            }
        }
    }
}
</span>

运行效果如下:

从上面的对比我们很容易可以看出,使用linq更加简洁,接下来,小编简单的介绍一下linq的扩展方法,那么什么是扩展方法呢?扩展方法又是如何出现的呢? .net framework为编程人员提供了很多的类,很多的方法,但是,不论.net framework在类中为我们提供了多么多的方法,有时候仍然不能满足我们的需求,例如:你想让字符串对象具有ToPascal方法,含义就是将字符串转化为Pascal格式,并返回,我们知道,.net framework提供的String类中并没有为我们提供相应的方法,此时,我们应该怎么做才可以达到我们的目的呢?有人说可以继承String类,这个不行,因为.net
framework提供的类都是finnal类,最终类,不能被继承,那么,怎么样才可以解决这个问题呢?此时,就出现了扩展方法。扩展方法有哪些好处呢? 为现有类提供一些额外的方法,这样做的好处就是,原有类不需要重新编译生成,只需要在程序中引入一些额外的dll就可以了,我们来看一个具体的例子。

比如说,我们有个字符串,当我们定义一个变量之后,比如说,我们给他一个值,在s字符串里面有一组方法,那么这组方法是系统帮我们定义好的,如果有天,我想要一个特殊的方法,比如topuuer转换成大写,tolower转换成小写,在接着,我想要首字母大写后面都小写,怎么办,这里面没有这种方法,怎么办nie,怎么去实现这种功能,这个就是我们扩展方法中要解决的问题,扩展方法的目标就是对现有的类提供额外的方法以增强该类的功能,我们可以这么来做,给他加一个扩展方法,首先,我们来做一个静态类,扩展方法是一种特殊的静态方法,我们怎么样来实现呢,如下:

<span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ch01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

   private void btnExtraMethod_Click(object sender, EventArgs e)
        {
            //拓展方法,目标,对现有的类提供额外的方法以增强类的功能
            string s = "asEdSadaDsdSsa";
            Console.WriteLine(s.ToUpper());
            Console.WriteLine(s.ToLower());
            Console.WriteLine(s.ToPascal());
            Console.WriteLine(s.ToPascal(2));
        }
  //将字符串的手写字母转换为大写字母的方法
        public string toPascal(string s)
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
        }</span>

运行效果如下:

最后,小编来简单的介绍一下lambda表达式,C#Lambda基本的表达形式:(参数列表) => {方法体},说明一下,参数列表中的参数类型可以是明确类型或者是推断类型,如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来,Lambda 用在基于方法的 LINQ 查询中,作为诸如Where 和 Where 等标准查询运算符方法的参数。我们来看一个具体的例子:

<span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

public partial class Form1 : Form
    {
        //定义一个委托
        public delegate string deleTransfer(string s);  

        public Form1()
        {
            InitializeComponent();
        }  

        private void btnTest_Click(object sender, EventArgs e)
        {
            //拓展方法----
            string strTest = "asdsad";
            Console.WriteLine(strTest.ToLower());
            Console.WriteLine(strTest.ToUpper());
            Console.WriteLine(strTest.ToPascal());
            Console.WriteLine("-------------------------------------");  

            //Lambda 来源
            //.Net FrameWork 1.0委托---函数指针
            deleTransfer trans = new deleTransfer(ToPascal);  //委托指向方法ToPascal
            Console.WriteLine(trans("abcdEFGH"));  

            //.net 2.0 匿名方法
            deleTransfer transs = delegate(string s) { return s.Substring(0,1).ToUpper() + s.Substring(1).ToLower(); };
            Console.WriteLine(transs("abcdEFGH"));  

            //.net 3.5 匿名方法
            //deleTransfertransss = (s) => (s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower());
            deleTransfer transss = s =>s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
            Console.WriteLine(transss("abcdEFGH"));
        }  

        //将字符串的首字母转化为大写字母的方法
        public string ToPascal(string s)
        {
            return s.Substring(0,1).ToUpper() + s.Substring(1).ToLower();
        }
    }  

    public static class ExtraClass
    {
        //拓展方法,特殊的静态方法
        public static string ToPascal(this string s)   //this后带类型,表名为该类型添加特殊的方法
        {
            return s.Substring(0,1).ToUpper() + s.Substring(1).ToLower();
        }
        public static string ToPascal(this string s, int len)   //this后带类型,表名为该类型添加特殊的方法
        {
            return s.Substring(0,1).ToUpper() + s.Substring(1, len).ToLower() + s.Substring(len + 1);
        }
}
</span>

它的发展过程是在C#1.0中使用的委托,C#2.0中添加了匿名方法,C#3.0中添加了lambda表达式。

小编寄语:该博文,小编主要简单的介绍了linq的一些基本知识,包括linq和sql的对比,linq的扩展方法以及lambda表达式,对linq的理解还不是很深刻,欢迎小伙伴们一起讨论交流,Linq的一个重要功能就是ORMapping思想的具体实现,ORMapping的思想就是实现编程的真正面向对象,使我们不用关心数据库,只需要关系实体类或实体集合类就行。项目进行中,未完待续......

linq---我为你提笔序,你的美不只查询语句的更多相关文章

  1. linq to ef(相当于sql中in的用法)查询语句

    select * from DoctorInfo doctor where doctor.HosDepartId in (select Id from HospitalDepartment hd wh ...

  2. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  3. c# linq查询语句详细使用介绍

    本文介绍Linq的使用方法 linq介绍 LINQ只不过是实现IEnumerable和IQueryable接口的类的扩展方法的集合. LINQ可以查询IEnumerable集合或者IQueryable ...

  4. 简单的Linq查询语句

    下面我来我大家介绍几种简单的查询方式. 1.简单语法 这个LINQ语句的第一个关键字是from,from后面加的是范围变量,范围变量后加in,后加上事先实例化的模型,然后点出数据的来源. List是列 ...

  5. sql 、linq、lambda 查询语句的区别

    LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量中被查询的值 [group by 条件] Lambda ...

  6. LINQ中的一些查询语句格式

    LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...

  7. linq字符串搜索条件,排序条件-linq动态查询语句 Dynamic LINQ

    在做搜索和排序的时候,往往是前台传过来的字符串做条件,参数的数量还不定,这就需要用拼sql语句一样拼linq语句.而linq语句又是强类型的,不能用字符串拼出来. 现在好了,有个开源的linq扩展方法 ...

  8. VB.NET中LINQ TO List泛型查询语句(分组,聚合函数)

    Public Class LinqToList 'LINQ在C#中使用比较方便,但是在VB中使用比较麻烦,复杂,和C#用法并不太一样 Dim listNew As List(Of Product) = ...

  9. Linq 实现sql中的not in和in条件查询

    T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID in (1, 2) T-S ...

随机推荐

  1. TeamForge使用指南

    1.什么是TeamForge 可以把TeamForge简单的理解为另外一种github 2.TeamForge的地址 与Project有关,一般会有明确的Link 3.TeamForge登录 用户名和 ...

  2. http协议无状态中的 "状态" 到底指的是什么?!

    引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了:无状态的[状态]到底指的是什么?! 找了很多资料不仅没有发现有一针见血正面回答这个问题的, ...

  3. java中的构造,封装

    今天给大家讲一下面向对象中的构造,封装: 构造:构造方法有以下几个特点:1.方法名和类名一致.2.无返回类型.接下来的几种构造样式,直接上代码吧: //这是一个宠物类 有一个属性:名字(name) p ...

  4. 干货!一次kafka卡顿事故排查过程

    由于一次功能上线后,导致某数据量急剧下滑,给我们紧张的呢!排查过程也是个学习过程(这其中有大部分是领导们的功劳,不过分享给大家应该也不犯法吧,ᐓ) 1. 确认问题的真实性? 被数据部门告知,某数据量下 ...

  5. Dockerfile怎么创建镜像

    编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像. 基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Docker ...

  6. JMETER_从入门到放弃系列

    基础篇 Jmeter(一)_环境部署 Jmeter(二)_基础元件 Jmeter(三)_配置元件 Jmeter(四)_16个逻辑控制器 Jmeter(五)_24个函数 Jmeter(六)_前置处理器 ...

  7. Nodejs 模块查找机制还不错(从当前目录开始逐级向上查找node_modules)

    比如 m.js是能够调用a.js的, 这样子目录就可以避免重复安装node_modules. 够用了.

  8. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法 ...

  9. 动手试试Android Studio插件开发

    由于业务关系,经常需要写一些表单页面,基本也就是简单的增删改查然后上传,做过几个页面之后就有点想偷懒了,这么低水平重复性的体力劳动,能不能用什么办法自动生成呢,查阅相关资料,发现android stu ...

  10. Mybatis源码学习之TypeHandler

    ORM框架最重要功能是将面向对象方法中的对象和关系型数据库中的表关联了起来,在关联过程中就必然涉及到对象中的数据类型和数据库中的表字段类型的转换,Mybatis中的org.apache.ibatis. ...