在查询中,指定要从数据源检索的信息。 查询还可以指定在返回信息之前应如何对信息进行排序、分组和调整。 LINQ 提供了一组可在查询中使用的标准查询方法。 其中大多数方法对序列进行作;在此上下文中,序列是一个对象,其类型实现 IEnumerable<T> 接口或 IQueryable<T> 接口。 标准查询运算符查询功能包括筛选、投影、聚合、排序、分组、分页等。 一些较常用标准查询运算符具有专用关键字语法,以便可以使用查询表达式语法调用它们。 与基于方法的等效查询相比,查询表达式是一种表达查询的方式,其可读性更强。 查询表达式子句在编译时转换为对查询方法的调用。 有关具有等效查询表达式子句的标准查询运算符的列表,请参阅 标准查询运算符概述。
LINQ to Entities 查询不支持所有标准查询运算符。 有关详细信息,请参阅支持的和不支持的 LINQ 方法(LINQ to Entities)。 本主题提供有关特定于 LINQ to Entities 的标准查询运算符的信息。 有关 LINQ to Entities 查询中的已知问题的详细信息,请参阅 LINQ to Entities 中的已知问题和注意事项。
投影和筛选方法
投影 是指将结果集的元素转换为所需形式。 例如,可以投影结果集中每个对象所需的属性的子集,可以投影属性并对该属性执行数学计算,也可以从结果集中投影整个对象。 投影方法是 Select 和 SelectMany。
筛选 是指限制结果集仅包含与指定条件匹配的元素的作。 筛选方法是 Where。
LINQ to Entities 中支持大多数投影和筛选方法的重载(除了那些接受位置参数的方法)。
联接方法
联接是针对数据源之间没有可导航关系的查询中的重要操作。 两个数据源的连接是一个数据源中的对象与共享共同属性或特性的另一个数据源中的对象关联。 联接方法为 Join 和 GroupJoin。
大多数联接方法的重载都受支持,除了使用 IEqualityComparer<T> 的方法。 这是因为无法将比较器转换为数据源。
设置方法
LINQ 中的集合操作是指在同一个或另一个集合(或集合)中根据等效元素的存在或不存在来确定结果集的查询操作。 集合方法是All、Any、Concat、Contains、DefaultIfEmpty、Distinct、EqualAll、Except、Intersect和Union。
LINQ to Entities 支持大多数集方法的重载,但与 LINQ to Objects 相比,行为存在一些差异。 但是,并不支持使用 IEqualityComparer<T> 的集方法,原因是比较器不能转换为数据源。
排序方法
排序或排序是指根据一个或多个属性对结果集的元素进行排序。 通过指定多个排序条件,可以破坏组中的关系。
大多数排序方法的重载都受支持,除了使用 IComparer<T> 的方法。 这是因为无法将比较器转换为数据源。 排序方法包括OrderBy、OrderByDescending、ThenByThenByDescending和Reverse。
由于查询在数据源上执行,因此排序行为可能与 CLR 中执行的查询不同。 这是因为可以在数据源中设置排序选项,例如大小写排序、汉字排序和 null 排序。 根据数据源,这些排序选项可能会生成与 CLR 不同的结果。
如果在多个排序作中指定相同的键选择器,则会生成重复的排序。 此举无效并将引发异常。
分组方法
分组是指将数据放入组中,以便每个组中的元素共享一个通用属性。 分组方法是 GroupBy。
大多数分组方法的重载都受支持,除了使用 IEqualityComparer<T> 的方法。 这是因为无法将比较器转换为数据源。
分组方法使用对关键字选择器的不同子查询映射到数据源。 使用数据源的语义执行键选择器比较子查询,包括与比较 null 值相关的问题。
聚合方法
聚合操作从值集合计算一个值。 例如,从一个月的每日温度值计算日均温度是一个聚合操作。 聚合方法包括Aggregate、Average、Count、LongCount、Max、Min和Sum。
大多数聚合方法的重载都受支持。 对于与 null 值相关的行为,聚合方法使用数据源语义。 涉及 null 值时聚合方法的行为可能有所不同,具体取决于正在使用的后端数据源。 使用数据源语义的聚合方法行为也可能不同于 CLR 方法的预期行为。 例如,SQL Server 上方法的默认行为 Sum 是忽略任何 null 值,而不是引发异常。
聚合导致的任何异常(例如 Sum 函数的溢出)在查询结果具体化期间作为数据源异常或 Entity Framework 异常引发。
对于涉及对序列进行计算的方法,例如 Sum 或 Average,实际计算是在服务器上进行的。 因此,服务器可能会发生类型转换和精度损失,结果可能与使用 CLR 语义的预期不同。
下表显示了 null/非 null 值的聚合方法的默认行为:
| 方法 | 无数据 | 所有空值 | 一些 空 值 | 无空值 |
|---|---|---|---|---|
Average |
返回 null。 | 返回 null。 | 返回序列中非 null 值的平均值。 | 计算数值序列的平均值。 |
Count |
返回 0 | 返回序列中的 null 值数。 | 返回序列中的 null 值和非 null 值的数目。 | 返回序列中的元素数。 |
Max |
返回 null。 | 返回 null。 | 返回序列中的最大非 null 值。 | 返回序列中的最大值。 |
Min |
返回 null。 | 返回 null。 | 返回序列中的最小非 null 值。 | 返回序列中的最小值。 |
Sum |
返回 null。 | 返回 null。 | 返回序列中非 null 值的总和。 | 计算数值序列的总和。 |
类型方法
处理类型转换和测试的两个 LINQ 方法在实体框架的上下文中均受支持。 这意味着唯一受支持的类型是映射到相应实体框架类型的类型。 有关这些类型的列表,请参阅概念模型类型(CSDL)。 类型方法为 Convert 和 OfType。
OfType 对实体类型提供支持。
Convert 支持用于概念模型的基元类型。 还支持 C# is 和 as 方法。
分页方法
分页操作返回序列中的单个元素或多个元素。 支持的分页方法包括First、FirstOrDefault、Single、SingleOrDefault和SkipTake。
不支持许多分页方法,因为无法将函数映射到数据源,或者数据源上缺少集的隐式排序。 返回默认值的方法仅限于概念模型基元类型和具有 null 默认值的引用类型。 对空序列执行的分页方法将返回空值。