LINQ To SQL深入学习系列之四(LINQ查询基础)

简介:

本文部分内容整理自msdn

一、LINQ的概念:
LINQ是Language Integrated Query(语言集成查询)的简称,它是集成在.NET编程语言中的一种特性,这使得查询表达式可以得到很好的编译时语法检查,丰富的元数据,智能感知等强类型语言的好处LINQ 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。

二、LINQ出现的背景:
传统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,您还必须针对以下各种数据源学习不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。LINQ 使查询成为 C# 和 Visual Basic 中的一等语言构造。您可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。在 Visual Studio 中,可以用 Visual Basic 或 C# 为以下各种数据源编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集以及支持 IEnumerable 或泛型 IEnumerable<T>) 接口的任意对象集合。此外,还计划了对 ADO.NET Entity Framework 的 LINQ 支持,并且第三方为许多 Web 服务和其他数据库实现编写了 LINQ 提供程序。

三、查询表达式解析:

 

ContractedBlock.gif 查询解析实例

结果为:
Numbers < 5:
4
1
3
2
0

 

在语义上等同于以下方法风格的查询
 var lowNums = numbers
               .Where(s => s < 5)
               .OrderBy(s => s)
               .Select(s => s);
在往下讲解之前我们先介绍些基础知识Func泛型委托,这是.net帮我们定义好的一种委托形式。
Func(T, TResult) 泛型委托:封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。写成委托的格式如下:
public delegate TResult Func<T, TResult>(T arg)

Func泛型委托总共有四种:
Func(T1, T2, TResult) 泛型委托 
Func(T1, T2, T3, TResult) 泛型委托 
Func(T1, T2, T3, T4, TResult) 泛型委托 
Lamda表达式其实就相当于以下的匿名委托
Func<int, bool> filter = delegate(int s) { return s < 5; }; //相当于s => s < 5
Func<int, int> extract = delegate(int s) { return s; };  //相当于s => s
Func<int, int> get = delegate(int s) { return s; };  //相当于s => s
var lowNums = numbers.Where(filter).OrderBy(extract).Select(get);
where方法是一个定义于System.Linq命名空间的扩展方法

 

ContractedBlock.gif where源码

 

这里的predicate就是你传入的Lamda表达式,where会根据这个Lamda表达式进行数据筛选。

所有 LINQ 查询操作都由以下三个不同的操作组成:
1、获取数据源。
2、创建查询。
3、执行查询。

数据源:
在上一个示例中,由于数据源是数组,因此它隐式支持泛型 IEnumerable<T>)接口。这一事实意味着该数据源可以用 LINQ 进行查询。在 foreach 语句中执行查询,而 foreach 要求使用 IEnumerable 或 IEnumerable<T>)。支持 IEnumerable<T>)或派生接口(如泛型 IQueryable<T>)的类型称为“可查询类型”。

查询:
查询指定要从数据源中检索的信息。查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。查询存储在查询变量中,并用查询表达式进行初始化。为使编写查询的工作变得更加容易,C# 引入了新的查询语法。上一个示例中的查询表达式包含三个子句:from、where 和 select。(如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。) from 子句指定数据源,where 子句应用筛选器,select 子句指定返回的元素的类型。目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。

执行查询:
上面例子中的foreach循环就是LINQ 的执行过程,LINQ中的执行查询分两种,强制立即执行和延迟执行,我们会在以后的部分中详细进行讲解。

四、LINQ 和泛型类型
LINQ 查询基于泛型类型,在 .NET Framework 的 2.0 版中引入了泛型类型。您无需深入了解泛型即可开始编写查询。但是,您可能需要了解两个基本概念:

1、当您创建泛型集合类(如 List<T>))的实例时,您将“T”替换为列表将包含的对象的类型。例如,字符串列表表示为 List<string>,Customer 对象列表表示为 List<Customer>。泛型列表是强类型的,且提供了比将其元素存储为 Object 的集合更多的好处。如果您尝试将 Customer 添加到 List<string>,则会在编译时出现一条错误。泛型集合易于使用的原因是您不必执行运行时类型强制转换。

2、IEnumerable<T> 是一个接口,通过该接口,可以使用 foreach 语句来枚举泛型集合类。泛型集合类支持 IEnumerable<T>),就像非泛型集合类(如 ArrayList)支持 IEnumerable。

LINQ 查询变量都实现或继承了 IEnumerable<T> 接口,如 IQueryable<T>。当您看到类型化为 IEnumerable<Customer> 的查询变量时,这只意味着在执行该查询时,该查询将生成包含零个或多个 Customer 对象的序列。

 

ContractedBlock.gif Code


本文转自 你听海是不是在笑 博客园博客,原文链接:http://www.cnblogs.com/nuaalfm/archive/2008/08/18/1270152.html  ,如需转载请自行联系原作者
相关文章
|
22天前
|
SQL 存储 缓存
高基数 GroupBy 在 SLS SQL 中的查询加速
本文详细介绍了SLS中的高基数GroupBy查询加速技术。
|
21天前
|
SQL 运维 程序员
一个功能丰富的SQL审核查询平台
一个功能丰富的SQL审核查询平台
|
3天前
|
SQL
SQL: 巧妙使用CASE WHEN实现查询
文章演示了如何利用SQL中的CASE WHEN语句来有效地进行条件性聚合查询,通过具体示例展示了CASE WHEN在统计分析中的应用技巧。
9 0
|
28天前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age &gt; 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
34 0
|
28天前
|
SQL 关系型数据库 MySQL
|
28天前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
59 0
|
28天前
|
Java UED 开发者
当错误遇上Struts 2:一场优雅的异常处理盛宴,如何让错误信息成为用户体验的救星?
【8月更文挑战第31天】在Web应用开发中,异常处理对确保用户体验和系统稳定性至关重要。Struts 2 提供了完善的异常处理机制,包括 `exception` 拦截器、`ActionSupport` 类以及 OGNL 表达式,帮助开发者优雅地捕获和展示错误信息。本文详细介绍了 Struts 2 的异常处理策略,涵盖拦截器配置、错误信息展示及自定义全局异常处理器的实现方法,使应用程序更加健壮和用户友好。
35 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
111 0
|
4月前
|
SQL 安全 关系型数据库
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
62 0
|
SQL 关系型数据库 MySQL
15天学习MySQL计划-SQL语言学习(基础篇)-第二天
15天学习MySQL计划-SQL语言学习(基础篇)-第二天
169 1