LINQ - 實體
作為 ADO.NET 實體框架的一部分,LINQ to Entities 比 LINQ to SQL 更加靈活,但由於其複雜性和缺乏關鍵特性而不太受歡迎。然而,它沒有 LINQ to SQL 的侷限性,LINQ to SQL 僅允許在 SQL Server 資料庫中查詢資料,而 LINQ to Entities 則可以方便地在大量資料提供程式(如 Oracle、MySQL 等)中查詢資料。
此外,它得到了 ASP.Net 的主要支援,使用者可以使用資料來源控制元件透過 LINQ to Entities 執行查詢,並方便地繫結結果,而無需任何額外的編碼。
由於這些優勢,LINQ to Entities 如今已成為在資料庫上使用 LINQ 的標準機制。使用 LINQ to Entities 還可以輕鬆更改查詢資料的詳細資訊並提交批次更新。LINQ to Entities 最吸引人的事實是,它的語法與 SQL 相同,甚至擁有相同的標準查詢運算子組,如 Join、Select、OrderBy 等。
LINQ to Entities 查詢建立和執行過程
從 ObjectContext(實體連線)構建 ObjectQuery 例項
使用新構建的例項,用 C# 或 Visual Basic (VB) 編寫查詢
將 LINQ 的標準查詢運算子以及 LINQ 表示式轉換為命令樹
執行查詢,並將遇到的任何異常直接傳遞給客戶端
將所有查詢結果返回給客戶端
ObjectContext 這裡是指主要類,它能夠與 實體資料模型 進行互動,或者換句話說,充當連線 LINQ 與資料庫的橋樑。命令樹是此處與實體框架相容的查詢表示形式。
另一方面,實體框架實際上是 物件關係對映器,開發人員通常將其縮寫為 ORM,它根據資料庫表生成業務物件和實體,並方便執行建立、更新、刪除和讀取等各種基本操作。下圖顯示了實體框架及其元件。
使用 LINQ 和實體模型進行 ADD、UPDATE 和 DELETE 的示例
首先按照以下步驟新增實體模型。
步驟 1 - 右鍵單擊專案,然後單擊新增新項將開啟如下所示的視窗。選擇 ADO.NET 實體資料模型,並指定名稱,然後單擊新增。
步驟 2 - 選擇從資料庫生成。
步驟 3 - 從下拉選單中選擇資料庫連線。
步驟 4 - 選擇所有表。
現在編寫以下程式碼。
using DataAccess;
using System;
using System.Linq;
namespace LINQTOSQLConsoleApp {
public class LinqToEntityModel {
static void Main(string[] args) {
using (LinqToSQLDBEntities context = new LinqToSQLDBEntities()) {
//Get the List of Departments from Database
var departmentList = from d in context.Departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
//Add new Department
DataAccess.Department department = new DataAccess.Department();
department.Name = "Support";
context.Departments.Add(department);
context.SaveChanges();
Console.WriteLine("Department Name = Support is inserted in Database");
//Update existing Department
DataAccess.Department updateDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 1);
updateDepartment.Name = "Account updated";
context.SaveChanges();
Console.WriteLine("Department Name = Account is updated in Database");
//Delete existing Department
DataAccess.Department deleteDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 3);
context.Departments.Remove(deleteDepartment);
context.SaveChanges();
Console.WriteLine("Department Name = Pre-Sales is deleted in Database");
//Get the Updated List of Departments from Database
departmentList = from d in context.Departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
編譯並執行上述程式碼後,將產生以下結果: