查询表达式(LINQ)简介
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。
LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源.
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里所有的东西都可以在这里找到了。