[翻译] - <Entity Framework> - 数据查询
纯属学习上的记录, 非专业翻译, 如有错误欢迎指正!
原文地址: http://msdn.microsoft.com/en-us/library/gg696167(v=vs.103)
在 EF 中, 下面的类代表着对概念模型: DbQuery 类, DbQuery 泛型类和 ObjectQuery 泛型类的查询. DbQuery 类和DbQuery 泛型类在 EF 4.1 的时候已经介绍过了. 一般情况下, 你不直接使用这些类, 但你会经常和继承了这些类的子类打交道. DbSet 泛型类继承了 DbQuery 泛型类. 而 DbSet 类继承了 DbQuery 类; 当实体类的类型在编译期仍不能确定时, 我们便要使用非泛型版的 DbSet. ObjectSet 泛型类继承了 ObjectQuery 泛型类. 实体集类提供了一个返回相应类型的所有实体对象的起始查询方法. 该查询可以通过面向实体的 LINQ 方法进一步细化. 实体集类同时也提供了一些方法实现常用操作, 如添加和删除上下文对象中的实体对象等.
你与这些实体类交互的典型方式是通过一个强类型的上下文对象. 该上下文对象继承自 DbContext 类或 ObjectContext 类, 由 EF 工具生成的类或你的 POCO 类充当, 其中的属性将返回一个 DbSet 或 ObjectSet 对象. 在接下来的例子中, 我们定义了一个模型, 其中有一个叫做 Department 的类. 然后我们定义了一个上下文类, 公开了一个 Department 属性. 该属性将作为一个起始查询使用.
1 using System.Data.Entity; 2 public class Department 3 { 4 public Department() 5 { 6 } 7 8 public int DepartmentID { get; set; } 9 public string Name { get; set; } 10 } 11 public class DepartmentContext : DbContext 12 { 13 public DbSet<Department> Departments { get; set; } 14 }
创建并执行该查询将返回数据库中的 Department 对象.
1 var departments = context.Departments; 2 foreach (var d in departments) 3 Console.WriteLine("Name: {0} ", d.Name);
执行查询
当下列情况发生时一个查询将会被执行:
- 被 foreach (C#) 或 For Each (Visual Basic) 语句枚举;
- 被类似 ToArray, ToDictionary 或 ToList 的集合操作方法枚举;
- First 或 Any 之类的 LINQ 操作在查询的最外层被调用;
- 调用了 DbSet 的 Load 扩展方法;
由 EF 执行的查询会对数据库中的数据进行评估. 一般情况下, 上下文中不存在的对象会被附加到上下文中. 而如果一个对象在上下文中已经存在, 那么这个对象的所有属性值将保持不变, 即从数据库中获得的属性值会被丢弃. 当你执行一个查询时, 那些被附近到上下文中, 但还没更新到数据库的对象, 无法作为结果集的一部分返回. 如果你想获取上下文对象中的数据, 你可以用 System.Data.Entity.DbSet.Find(System.Object[]) 或 System.Data.Entity.DbSet.Local 方法 (这些方法会在 Object Queries 中讨论).
如果你不打算更新或删除实体, 也不需要身份管理功能, 你可以考虑使用 AsNoTracking 扩展方法, 这将提升查询的执行效率. 由这个方法返回的实体不会被上下文对象跟踪.
如果你想用数据库中的数据来更新实体对象的值, 可以调用 Reload 方法. 这个方法会用数据库中的数据覆盖实体的所有属性值.
译注: Reload 方法属于 System.Data.Entity.Infrastructure 命名空间. 需要将实体对象转换为 DbEntityEntry 后才可以调用. 如: context.Entry(department).Reload();
注: 如果一个查询在数据库中没有获取到数据, 返回的结果会是一个空的集合, 而不是 null.
在本节中
Object Queries (Entity Framework)
[翻译] - <Entity Framework> - 对象检索
讨论查询数据库或内存中的对象的各种方法
Load Related Objects (Entity Framework)
[翻译] - <Entity Framework> - 载入相关对象
介绍载入关联实体的各种方式
Directly Executing Data Source Commands (Entity Framework)
[翻译] - <Entity Framework> - 直接执行数据库命令
讨论让你能对数据库执行原生的 SQL 命令的方法