查询是从数据源获取数据的方式。查询通常被表示为特别的查询语言,不同的语言已经被开发可以查询不同的数据源,比如SQL可以查询关系型数据库,xQuery可以查询xml,因此面对每一个数据源或数据格式程序员都必须学习这些数据源支持的查询语言。现在微软简化了这种情况。他提供了一个一致的模式可以面对各种数据源和数据形式。使用linq可以使用对象来工作, 你可以使用同样的代码模式来读取转换数据从xml文档,sqlserver数据库,ado.net的dataset对象,net的collections中或者其他数据源。
一.查询操作的三部分
所有的查询操作都必须有下面三步
1.获取数据源
2.创建查询
3.执行查询
下面描述了查询操作的三部分。如你所见,在LINQ中执行查询和查询本身是本质不同的,也就说你创建查询的时候并没有获得到数据。
通过源代码来演示查询操作的三部分,方便起见使用使用字符串数组作为数据源。当然也可以使用其他数据源
// 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);
}
-----------
Output 0 2 4 6
//(个人备注:其中使用了泛型的接口,不多说了。from,in,where,select是其中关键字。select是返回的意思。num就是得到的对象)
二:数据源
上个列子使用数组作为数据源,他暗示使用泛型IEnumerable可以被linq支持,IEnumerable可以通过foreach进行枚举遍历,这也就是linq被执行的过程。那些支持IEnumerable的类或获得接口泛型IQueryable<(Of <T>)>的类成为“可查询类”(queryable types.)
所以任何支持IEnumerable的集合类,如泛型list,Dictionary或其他net中的类。作为一个可查询类如果在内存中还不存在,linq提供者可以这样来层现他,比如xml
// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
下面的列子Customer 显示数据库里面的一个特定表。而且Table<Customers> 支持泛型IQueryable<(Of <T>)>.
// 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 basic rule is very simple: a LINQ data source is any object that supports the generic IEnumerable<(Of <T>)> interface, or an interface that inherits from it.
其中最基本的原则是很简单的:一个linq数据源可以是任何对象。只要他支持泛型IEnumerable。或者一个接口继承他。
(ArrayList支持非泛型IEnumerable,也可以作为linq的数据源。更多的信息可以查询msdn,我以后可能会翻译相关资料)
三:查询
查询可以是你获取数据源数据的明确信息。也就是查询可以具体指明数据的排序,分组等。为了方便建立查询。c#已经融合了新的查询语法。你可以使用查询语法来创建查询,并且其中可以有几个限制语句的组合(我的理解就是原来的where)
查询表达式包括三个从句:from,where,select(和sql相识,但是语法是反的)
四:执行查询
“推迟执行”(或搁置执行)
当查询被设计去产生一列数据,查询本身只存储查询命令,执行查询被推迟直到你开始通过foreach遍历查询变量的时候。
// Query execution. foreach (int j in numQuery) { Console.Write("{0,1} ", j); }
"立刻执行"
相对“推迟执行”而言,查询产生单独一个结果的时候立刻执行。查询产生单独一个结果的列子有Count, Max, Average, and First。他们是立刻执行的
int query = (from num in numbers where (num % 2) == 0 select num).Count(); 当返回结果不是单独一个的时候,也可以使用强制执行。可以使用 ToList<(Of <TSource>)> or ToArray<(Of <TSource>)> 这两个方法
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();//(这里可以使用var 来声明变量。不知道是不是新出来的还是原来就有。)
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。