程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Entity Data Model (EDM)深入分析, Part 3

Entity Data Model (EDM)深入分析, Part 3

編輯:關於.NET

EntityClient

實體框架(Entity Framework)在ADO.NET 3.5 提供程序的基礎上引入新的 ADO.NET 提供程序 EntityClient。Entity­Client 看上去與之前使用的 ADO.NET 提供程序非常類似,它將提供第一個抽象,可允許開發人員使用標准的 Connection、Command 和 DataReader 對象依照 EDM 執行查詢。它還會將映射域模型所需的客戶端視圖引擎(根據 EDM 定義的)添加到底層關系數據庫架構。必要時,EntityClient 可借助 ESQL 查詢字符串讓開發人員以行和列的形式處理實體,而不必生成類來表示概念架構。

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"]);
}

3. EntityCommand 帶參數查詢

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的查詢。

1. LINQ 帶參數查詢

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);

2. LINQ 查詢返回匿名類型

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、變更跟蹤、並發… 等等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved