• 查询表达式(LINQ)简介


    摘自: 李永京横刀天笑 

    LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。

    LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源.

    LINQ的架构:

    LINQ架构

    LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML。

    LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提供强类型。

    LINQ to XML在System.Xml.LINQ命名空间下实现对XML的操作。采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。

    Linq to Objects 对内存中的集合的支持、Linq to Xml 对Xml的支持、Linq to SQL 对Sql Server的支持

    使用LINQ过程中需要使用到的4大特性:

    1、对象集合初始化

    对象集合初始化器:C# 3.0提供了对象集合初始化器

    //对象初始化器(初始化了一个book对象,直接在{}中给对象的对应属性赋值.)
    Book book = new Book { Title="Inside COM",ISBN="123-456-789"};

    2、匿名类型与隐式类型局部变量

    匿名类型:C# 2.0提供了匿名类型

    //KeyPair是一个匿名类型

    var KeyPair = new {Key=”yuyi”,Value=”20”};

    使用匿名类型进行对象集合初始化时,需要保持一下一致性:

    1、属性名称一致

    2、属性个数一致

    //以下方式会初始化两个不同的匿名对象,因为两条语句的属性名称不一致

    var KeyPair1 = new { Key="yuyi",Value="Programer"};
    var KeyPair2 = new { Key="y",Value1=3};

    隐式类型局部变量:C# 3.0提供了隐式类型局部变量

    关键字var声明一个隐式类型局部变量,声明的对象类型未知,需要C#编译器可以根据上下文推断的出来.

    对于隐式类型局部变量要注意以下几点:

    1、它只能存在于方法内部

    2、.它不是一个新的类型,只是一个关键字,或者叫做一个占位符,在C#编译器编译后它就会被确定的类型所替代

    3、.它是编译器根据上下文推断出来的,所以所有一切不能被编译器推断出来的用法都是错误的

    3、匿名方法和Lambda表达式

    匿名方法:没有方法名的方法。

    this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
    private void btnRefresh_Click(object sender, EventArgs e)
    {
        BindData();
    }

    使用匿名方法如下:

    this.btnRefresh.Click += delegate(object sender, EventArgs e) { BindData(); };

    Lambda表达式:一个Lambda就是一个delegate,一个delegate指向一个方法。

    使用匿名方法:

    books.Find(delegate(Book book){return book.Price < 50;});

    使用Lambda表达式:

    Lambda操作符读作”Goes to”,它后面紧跟着表达式或者是语句块(这点和匿名方法也不同,匿名方法只能使用语句块而不能使用表达式)

    //x的类型省略了,编译器可以根据上下文推断出来,后面跟着的是表达式
    x => x+1
    deleage(int x){return x+1;}


    //后面跟着的是语句块
    x=>{return x+1;}
    delegate(int x){return x+1;}


    //输入参数也可以带类型,带类型后别忘记小括号哦
    (int x) => x+1
    delegate(int x){return x+1;}


    //也可以多个输入参数,逗号分隔,别忘记小括号
    (x,y) => x+y
    delegate(int x,int y){return x+y;}
    //无参的也行


    () => 1
    delegate(){return 1;}

    4、扩展方法

    //给object类型添加了一个扩展方法,在.net里所有的类都继承自object,那所有的类都默认的拥有这个方法了

    public static class PropertyExtension
    {
    public static object GetValueByName(this object self, string propertyName)
            {
    if (self == null)
                {
    return self ;
                }
                Type t = self.GetType();
                PropertyInfo p = t.GetProperty(propertyName);
    return p.GetValue(self, null);
            }
    }

    扩展方法:

    1 方法所在的类必须是静态的

    2 方法也必须是静态的

    3 方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。

    4 在第一个参数前面还需要有一个this关键字。

    在Linq中,IEnumerable<T>类型的实例都可以使用扩展的扩展的静态方法。

    //.Where()方法为IEnumerable<T>的扩展方法.

    IList<Book> results = books.Where(book => book.Title == "yuyi");

    使用Reflector打开System.Core.dll,打开System.Linq命名空间,在这个命名空间里有一个Enumerable类,这里面就是微软为我们添加的扩展方法,看看,是不是SQL里所有的东西都可以在这里找到了。

  • 相关阅读:
    D. Renting Bikes 二分
    Maximum Absurdity DP + 数学
    模拟 H
    Secrets 数论
    A. Knight Tournament SET的应用
    B. Xenia and Hamming Codeforces 256B GCD,LCM处理字符串
    Alternate Task UVA11728 暴力枚举
    GCD Extreme (II) 欧拉函数的应用
    Bit Magic HDU 4421 2-Sat
    Encoding http://acm.hdu.edu.cn/showproblem.php?pid=1020
  • 原文地址:https://www.cnblogs.com/lanchong/p/2215439.html
Copyright © 2020-2023  润新知