查询表达式(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里所有的东西都可以在这里找到了。

posted @ 2011-10-17 15:26  远大 光明  阅读(402)  评论(0编辑  收藏  举报