Posted on 2007-07-31 23:26
小小牛 阅读(710)
评论(0) 编辑 收藏 引用 所属分类:
Linq
Linq是Language-Integrated Query的简称,是设置在visual studio 2008上,纳入c#和visual basic语言延伸的强大查询功能.能容易的查询和更新数据,并且能支持多种数据存储.visual studio 2008提供集合使得Linq能查询.net Framework collections,SQL databases, ADO.NET Datasets, and XML documents.Linq 提供了如下的优点:
(1).Linq简化了查询,假如你知道了c#或者visual basic,那么你能轻松的使用Linq;
(2)Linq统一任何数据源的数据查询,你能查询xml文档,同样的方式你可以查询sql database,ado.net dataset,in-memory collection和其他分布或者本地的数据源
(3)Linq加强了相关数据和面向对象的联系
(4)Linq加快的开发和debug
下面就对自己学习的过程记录一些自己学习感受,望大家指出不足
所有的Linq查询有下面基本的3个行为构成:
1,包含数据源
2,创建查询
3,执行查询
这里需要特别注意的是,查询的执行严格区别于查询本身,换句话来说就是不会获得任何的数据仅仅通过常见查询,要执行的过程中才会获得.
下面就是一段代码,表示了查询操作的3部分
// Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// Query creation.
IEnumerable<int> numQuery =
from num in numbers
where (num % 2) == 0
select num;
// Query execution.
foreach (int j in numQuery)
{
Console.Write("{0,1} ", j);
}
下面对这3部分做进一步的解释:
The Data Source
上面例子中的数据源类型是数组,支持IEnumerable接口,是它作为Linq查询的数据源,IEnumerable能被迭代通过foreach,这是Linq查询是如何执行的.支持IEnumerable或者是一个继承于该接口的其他接口,如IQueryable被称为可查询的类型.除了次类可查询的类型,其他的类型例xml document,Linq提供了可查询的类型XElement
// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
使用Linq to sql,你首先创建一个对象关系的映射通过O/R Designer,处理与database的通讯,并且Table支持IQueryable
// Create a data source from a SQL table.
// using System.Data.Linq;
DataContext db = new DataContext("c:\\northwind\\northwnd.mdf");
Table<Customer> Customers = db.GetTable<Customer>();
The Query
查询是想从数据源获得数据,查询可以指定什么信息应该被选择,被分类等并且什么类型应该被返回,一个查询语句至少应该包含2个语法元素from 和select
假如查询要返回一系列的值,查询变量必须是可查询的类型,最重要的是要集注查询变量本身不会采取任何行为,查询也不会返回数据.他仅仅是保存查询的信息,你创建了查询,当你去执行的时候才回获得数据
Query Execution
查询执行分为下面2类:
Deferred Execution(推迟执行)
当查询创建的时候查询变量本身知识存储查询的命令,真正意义上的查询被推迟到当你通过foreach循环在查询变量上迭代时候.
查询中返回一系列结果,查询变量本身不去拥有查询结果,着意味这你可以执行查询随你所需要,数据源没时刻更新,你也可以随时执行查询获得不同的数据.
Immediate Execution
与前面的不同,即使查询获得单独的一个值而且是立即的,例如Count,
Max,Average,First,这些查询立即获得一个单独的值,如下
int query = (from num in numbers
where (num % 2) == 0
select num).Count();
还有强制获得立即查询并且不是获得一个单独的值可以通过调用
ToList或者ToArray方法在一个查询变量身上
如下
List<int> query2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();
// or
var query3 =
(from num in numbers
where (num % 2) == 0
select num).ToList();