[翻译] - <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 类充当, 其中的属性将返回一个 DbSetObjectSet 对象. 在接下来的例子中, 我们定义了一个模型, 其中有一个叫做 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, ToDictionaryToList 的集合操作方法枚举;
  • FirstAny 之类的 LINQ 操作在查询的最外层被调用;
  • 调用了 DbSetLoad 扩展方法;

由 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 命令的方法

posted @ 2012-06-07 17:23  Howll Chen  阅读(799)  评论(0编辑  收藏  举报