查询是一种从数据源检索数据的表达式。 查询通常用专门的查询语言来表示。 随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的 SQL 和用于 XML 的 XQuery。 因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。 LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。 在 LINQ 查询中,始终会用到对象。 可以使用相同的基本编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ 提供程序可用的任何其他格式的数据。
查询操作的三个部分
所有 LINQ 查询操作都由以下三个不同的操作组成:
-
获取数据源。
-
创建查询。
-
执行查询。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Linq 8 { 9 class Program10 {11 static void Main(string[] args)12 {13 //创建int类型的数组14 //1.数据源15 int[] myInt = new int[7] { 0,1,2,3,4,5,6 };16 17 //2.创建查询18 var myQuery = from s in myInt19 where (s % 2) == 020 select s; 21 //3.执行查询22 foreach (var item in myQuery)23 {24 Console.WriteLine("{0}",item);25 }26 27 Console.ReadKey();28 29 30 }31 }32 }
下图显示了完整的查询操作。 在 LINQ 中,查询的执行与查询本身截然不同;换句话说,如果只是创建查询变量,则不会检索任何数据。
数据源
在上一个示例中,由于数据源是数组,因此它隐式支持泛型 接口。 这一事实意味着该数据源可以用 LINQ 进行查询。 查询在 foreach 语句中执行,因此,foreach 需要 或 。 支持 或派生接口(如泛型 )的类型称为可查询类型。
可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。 如果源数据还没有作为可查询类型出现在内存中,则 LINQ 提供程序必须以此方式表示源数据。 例如,LINQ to XML 将 XML 文档加载到可查询的 类型中:
1 // Create a data source from an XML document. 2 // using System.Xml.Linq;3 XElement contacts = XElement.Load(@"c:\myContactList.xml");
在 LINQ to SQL 中,首先手动或使用 在设计时创建对象关系映射。 针对这些对象编写查询,然后由 LINQ to SQL 在运行时处理与数据库的通信。 在下面的示例中,Customers 表示数据库中的特定表,并且查询结果的类型 派生自 。
1 Northwnd db = new Northwnd(@"c:\northwnd.mdf");2 3 // Query for customers in London.4 IQueryablecustQuery =5 from cust in db.Customers6 where cust.City == "London"7 select cust;
上一个示例中的查询从整数数组中返回所有偶数。 该查询表达式包含三个子句:from、where 和 select。(如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。)from 子句指定数据源,where 子句应用筛选器,select 子句指定返回的元素的类型。 一节中详细讨论了这些子句和其他查询子句。目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。 有关在幕后是如何构建查询的更多信息,请参见。