EntityClient
                                  实体框架(Entity Framework)在ADO.NET 3.5 提供程序的基础上引入新的 
                                    ADO.NET 提供程序 EntityClient。EntityClient 
                                    看上去与之前使用的 ADO.NET 提供程序非常类似,它将提供第一个抽象,可允许开发人员使用标准的 
                                    Connection、Command 和 DataReader 对象依照 EDM 执行查询。它还会将映射域模型所需的客户端视图引擎(根据 
                                    EDM 定义的)添加到底层关系数据库架构。必要时,EntityClient 可借助 
                                    ESQL 查询字符串让开发人员以行和列的形式处理实体,而不必生成类来表示概念架构。
                                   本系列文章上一篇:
                                     
                                    Entity Data Model (EDM) 深入分析, Part 1
                                     
                                    Entity Data Model (EDM) 深入分析, Part 2
                                 
                                 
                                  1. EntityCommand 查询返回实体类型
                                  Entity SQL也可以通过EntityClient 来执行,尽管代码比较啰嗦,但是在某些情况下,也是优点。
                                  1) 首先创建EntityConnection,重用Northwind data 
                                    context 的连接字符串,并打开连接。
                                  2) 创建 EntityCommand 对象,并传入Entity SQL语句和数据库连接对象。
                                  3) 创建DbDataReader对象,并循环读取返回的结果集。
                                 
                                 NorthwindEntities context = new NorthwindEntities();
                                  
                                 EntityConnection conn = new EntityConnection(context.Connection.ConnectionString);
                                 conn.Open();
                                  
                                 var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees 
                                  AS emp";
                                 EntityCommand cmd = new EntityCommand(sql, 
                                  conn);
                                  
                                 DbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                                 while (reader.Read())
                                 {
                                  Console.WriteLine("{0} {1} {2} 
                                  {3}", reader["EmployeeID"], reader["LastName"],
                                     reader["FirstName"], 
                                  reader["Country"]);
                                 }
                                 
                                  当时使用SequentialAccess的DbDataReader时,需要小心访问数据,务必有序的读取。
                                 
                                 
                                  如你改变成员的顺序,将抛出InvalidOperationException 异常 
                                    - "Attempt to read from column ordinal 
                                    '0' is not valid. With CommandBehavior.SequentialAccess, 
                                    you may only read from column ordinal '2' 
                                    or greater."
                                 
                                  
                                 Console.WriteLine("{0} {1} {2} {3}", 
                                  reader["LastName"], reader["EmployeeID"],
                                  reader["FirstName"], reader["Country"]);
                                 
                                  2. EntityCommand 查询返回匿名类型
                                 
                                
                                 EntityConnection conn = new EntityConnection(context.Connection.ConnectionString);
                                 conn.Open();
                                  
                                 var sql = "SELECT emp.LastName, emp.FirstName 
                                  " +
                                           
                                  "FROM NorthwindEntities.Employees AS emp";
                                 EntityCommand cmd = new EntityCommand(sql, 
                                  conn);
                                  
                                 DbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                                 while (reader.Read())
                                 {
                                  Console.WriteLine("{0} {1}", 
                                  reader["LastName"], reader["FirstName"]);
                                 }
                                
                                 
                                  EntityCommand 带参数也比较容易,在Entity SQL字符串中参数名称以@作为前缀,接着创建EntityParameter对象,并增加到EntityCommand 
                                    的Parameters集合内。
                                 
                                 EntityConnection conn = new EntityConnection(context.Connection.ConnectionString);
                                 conn.Open();
                                  
                                 var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees 
                                  AS emp " +
                                           
                                  "WHERE emp.Country = @country";
                                 EntityCommand cmd = new EntityCommand(sql, 
                                  conn);
                                  
                                 EntityParameter param = new EntityParameter("country", 
                                  DbType.String);
                                  
                                 param.Value = "USA";
                                 cmd.Parameters.Add(param);
                                  
                                 DbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                                 while (reader.Read())
                                 {
                                  Console.WriteLine("{0} {1} {2} 
                                  {3}", reader["EmployeeID"], reader["LastName"],
                                     reader["FirstName"], 
                                  reader["Country"]);
                                 }
                                 
                                 
                                  LINQ to Entities
                                  LINQ是在.NET v3.5 引入的新技术。相对于前面的Entity SQL而言,我更偏爱LINQ 
                                    to entities。LINQ查询虽然有一些局限,但是LINQ更容易、更自然,此外,还支持强类型,因此智能提示能帮助编写LINQ查询脚本。
                                 
                                  LINQ to Entities 与LINQ to Objects和LINQ 
                                  to SQL 基本一样,因此下面简单演示2个基本的LINQ to Entities的查询。
                                
                                 NorthwindEntities context = new NorthwindEntities();
                                  
                                 string country = "USA";
                                 var query = from e in context.Employees
                                             
                                  where e.Country == country
                                             
                                  select e;
                                  
                                 foreach (var emp in query)
                                  Console.WriteLine("{0} {1} {2} 
                                  {3}", emp.EmployeeID, emp.FirstName, emp.LastName, 
                                  emp.Country);
                                
                                 NorthwindEntities context = new NorthwindEntities();
                                  
                                 var query = from e in context.Employees
                                             
                                  select new { e.LastName, e.FirstName };
                                  
                                 foreach (var emp in query)
                                  Console.WriteLine("{0} {1}", 
                                  emp.LastName, emp.FirstName);
                                 
                                  这篇文章对Entity Data Model 和Entity Framework 
                                    提供了各种查询技术进行了简单的介绍,希望对你有帮助。下一篇文章将介绍更高级的 Entity 
                                    SQL 查询技术、查看SQL 语句、eager loading、变更跟踪、并发… 等等。