语言集成查询(LINQ)是一系列直接将查询功能集成到C#语言的技术统称。数据查询历来都表示为简单的字符串,没有编译时类型检查或IntelliSense支持,此外,需要针对每种类型的数据源了解不同的查询语言:SQL数据库,XML文档,各种Web服务类。借助LINQ,查询成为了最高级别的语言构造。
IntelliSense是一种代码补全辅助工具,它包含许多功能;成员列表,参数信息,快速信息和完成单词。使用这些功能,可以详细了解使用的代码,跟踪键入的参数,还可通过轻敲几个按键来添加属性和方法调用。
对于每个程序员来数,LINQ是一种"语言集成"查询表达式。查询表达式采用声明性查询语法编写而成。使用查询语法,可以用最少的代码对数据源执行筛选,排序和分组操作。可使用相同的基本查询表达式模式来查询和转换SQL数据库,ADO.NET数据集,XML文档和流以及.NET集合中的数据。
LINQ 查询操作在数据源、查询本身及查询执行中是强类型的。 查询中变量的类型必须与数据源中元素的类型和 foreach
语句中迭代变量的类型兼容。
List names=new List{"John","Rick","Maggie","Mary"};
IEnumerable respQuery = from name in names where name[0]=='M' select name;
foreach(string str in respQuery){
Console.WriteLine(str);
}
Table customers = db.GetTable();
IQueryable custNameQuery = from customer in customers where cust.City=="ShangHai"
select customer.Name;
foreach(string str in custNameQuery){
Console.WriteLine(str);
}
Table customers = db.GetTable();
IQueryable custNameQuery = from customer in customers where cust.City=="ShangHai"
select new {custName = customer.Name,
custPhone = customer.Phone};
foreach(var cust in custNameQuery){
Console.WriteLine(cust.Phone);
}
select
语句生成匿名类型,所以必须使用 var
隐式类型化查询变量。foreach
循环中的迭代变量也必须是隐式的。var Customers = db.GetTable();
var custQuery = from cust in Customers where cust.City == "London" select cust
foreach(var item in custQuery){
Console.WriteLine(item);
}
上面实例使用关键字var可用于查询操作中的任何本地变量,编译器为查询操作中的各个变量提供强类型。
LINQ查询变量被类型化为IEnumberable或派生类型(IQueryable)。看到类型化为IEnumberable的查询变量时,意味着执行查询时,该查询将生成包含零个或多个T类型对象的序列。
IEnumberable userQuery = from user in users where user.name="goyeer" select user;
IEnumberator对象是一个真正的集合访问器,如果没它就不能使用foreach语句遍历集合或数组,因为只有有了IEnumberator对象才能访问集合中的项,假如没有它连集合中的项都访问不了。
public class MyClass : IEnumerable
{
int[] temp = { 1, 32, 43, 343 };
public IEnumerator GetEnumerator()
{
return temp.GetEnumerator();
}
}
public class Program
{
public static void Main(String[] args){
MyClass temp = new MyClass();
foreach (int node in temp)
{
Debug.WriteLine(node);
}
}
}
IEnumberator
是所有非枚举型枚举器的基接口,其泛型等效是System.Collections.Generic.IEnumerator
接口。
枚举器可用于读取集合中的数据,但不能用于修改基础集合。枚举初始化时,定位在集合中第一个元素的前面。在读取的值Current之前,必须调用MoveNext方法以将枚举数推进到集合的第一个元素;否则为Current未定义。
在调用Current或MoveNext之前,Reset返回同一对象。MoveNext将Current设置为下一个元素。
如果MoveNext传递集合的末尾,则枚举器位于集合中最后一个元素之后,并MoveNext返回false。当枚举器位于此位置时,对MoveNext的后续调用也会返回false。如果最后一次MoveNext调用返回false,此时Current则为未定定义。
属性
方法
IEnumberable是一个可枚举的所有非泛型集合的基础接口。IEnumberable包含单个方法GetEnumberator;IEnumerable接口为foreach迭代提供了支持。
IEnumerator
接口定义对类中的集合类型对象的迭代方式。
IEnumerable
接口允许使用foreach循环进行枚举。
提供一组用于查询实现IQueryable的数据结构static方法。类中Queryable声明的方法集提供了标准查询运算的实现,用于查询IQueryable的数据源标准查询运算符是LINQ模式的常规用途方法,使你能够对任何中的数据表进行遍历,筛选和投影操作。
System.linq.Queryable中,参数接收的是一个表达式类型,返回IQueryable接口
System.linq.Enumerable中,参数接收的是一个谓词表达式,也就是一个委托
Func<>谓词表达式,就是一个委托,委托一旦调用,就立即执行了,将执行结果保存在内存中
Expression是一个表达式,会存储拼接表达式树,直到在运行期最终执行。