LINQ to Entities

LINQ to Entities 提供 Language-Integrated 查询(LINQ)支持,使开发人员能够使用 Visual Basic 或 Visual C# 针对 Entity Framework 概念模型编写查询。 针对实体框架的查询由针对对象上下文执行的命令树查询表示。 LINQ to Entities 将 Language-Integrated 查询 (LINQ) 查询转换为命令树查询,对实体框架执行查询,并返回实体框架和 LINQ 可以使用的对象。 下面是创建和执行 LINQ to Entities 查询的过程:

  1. ObjectQuery<T>构造ObjectContext实例。

  2. 使用 ObjectQuery<T> 实例在 C# 或 Visual Basic 中编写 LINQ to Entities 查询。

  3. 将 LINQ 标准查询运算符和表达式转换为命令树。

  4. 以命令树结构向数据源执行查询。 在执行期间对数据源引发的任何异常将直接传递给客户端。

  5. 将查询结果返回给客户端。

创建 ObjectQuery 实例

ObjectQuery<T>泛型类表示返回零个或多个类型实体集合的查询。 对象查询通常是从现有对象上下文构造的,而不是手动构造的,并且始终属于该对象上下文。 此上下文提供撰写和执行查询所需的连接和元数据信息。 ObjectQuery<T>泛型类实现IQueryable<T>泛型接口,其生成器方法使 LINQ 查询可以增量生成。 还可以使用 C# var 关键字(Dim 在 Visual Basic 中启用本地类型推理)让编译器推断实体的类型。

编写查询

ObjectQuery<T>实现泛型接口的泛型IQueryable<T>类的实例充当 LINQ to Entities 查询的数据源。 在查询中,请准确指定要从数据源检索的信息。 查询还可以指定在返回信息之前应如何对信息进行排序、分组和调整。 在 LINQ 中,查询存储在变量中。 此查询变量不执行任何作,不返回任何数据;它只存储查询信息。 创建查询后,必须执行该查询以检索任何数据。

LINQ to Entities 查询可以采用两种不同的语法组成:查询表达式语法和基于方法的查询语法。 C# 3.0 和 Visual Basic 9.0 中新增了查询表达式语法和基于方法的查询语法。

有关详细信息,请参阅 LINQ to Entities 中的查询

查询转换

若要针对实体框架执行 LINQ to Entities 查询,必须将 LINQ 查询转换为可针对实体框架执行的命令树表示形式。

LINQ to Entities 查询由 LINQ 标准查询运算符(如 SelectWhereGroupBy)和表达式(x > 10、Contact.LastName 等)组成。 LINQ 运算符不是由类定义的,而是类上的方法。 在 LINQ 中,表达式可以包含命名空间中的 System.Linq.Expressions 类型允许的任何内容,并通过扩展包含可在 lambda 函数中表示的任何内容。 这是一个包含了实体框架所允许的表达式的超集,这些表达式的定义仅限于数据库上允许的操作,并且受 ObjectQuery<T> 支持。

在 Entity Framework 中,运算符和表达式都由单个类型层次结构表示,然后放置在命令树中。 实体框架使用命令树执行查询。 如果 LINQ 查询不能表示为命令树,则会在转换查询时引发异常。 LINQ to Entities 查询的转换涉及两个子转换:标准查询运算符的转换和表达式的转换。

在 LINQ to Entities 中,有许多 LINQ 标准查询运算符没有有效的翻译。 尝试使用这些运算符将导致查询翻译时出现异常。 有关受支持的 LINQ to Entities 运算符的列表,请参阅支持的和不受支持的 LINQ 方法(LINQ to Entities)。

有关在 LINQ to Entities 中使用标准查询运算符的详细信息,请参阅 LINQ to Entities 查询中的标准查询运算符

通常,LINQ to Entities 中的表达式在服务器上计算,因此不应期望表达式的行为遵循 CLR 语义。 有关详细信息,请参阅 LINQ to Entities 查询中的表达式

有关如何将 CLR 方法调用映射到数据源中的规范函数的信息,请参阅 CLR 方法到规范函数映射

有关如何从 LINQ to Entities 查询中调用规范、数据库和自定义函数的信息,请参阅 LINQ to Entities 查询中的调用函数

查询执行

用户创建 LINQ 查询后,它将转换为与 Entity Framework(以命令树的形式)兼容的表示形式,然后针对数据源执行该表示形式。 在查询执行时,将在客户端或服务器上计算所有查询表达式(或查询组件)。 这包括用于结果具体化或实体投影的表达式。 有关详细信息,请参阅 查询执行。 有关如何通过编译查询一次,然后使用不同参数多次执行查询来提高性能的信息,请参阅编译的查询(LINQ to Entities)。

物化

具体化是将查询结果作为 CLR 类型返回给客户端的过程。 在 LINQ to Entities 中,永远不会返回查询结果数据记录;始终有一个后盾 CLR 类型,由用户或实体框架定义,或由编译器(匿名类型)生成。 所有对象具体化都由 Entity Framework 执行。 由于无法在实体框架和 CLR 之间进行映射而导致的任何错误,都会在对象实体化的过程中抛出异常。

查询结果通常作为下列结果之一返回:

  • 零个或多个类型化实体对象的集合,或概念模型中定义的复杂类型的投影。

  • Entity Framework 支持的 CLR 类型。

  • 内联集合。

  • 匿名类型。

有关详细信息,请参阅 查询结果

本节中

LINQ to Entities 中的查询

LINQ to Entities 查询中的表达式

在 LINQ to Entities 查询中调用函数

编译的查询(LINQ to Entities)

查询执行

查询结果

LINQ to Entities 查询中的标准查询运算符

CLR 方法至规范函数映射

支持和不支持的 LINQ 方法 (LINQ to Entities)

LINQ to Entities 中的已知问题和注意事项

另请参阅