EntityClient 是 ADO.NET Entity Framework 的資料提供者,類似 SqlClient,但針對概念模型 (EDM) 操作,支援 Entity SQL。
EntityConnection - 連接儲存模型EntityCommand - 執行 ESQL 命令或預存程序EntityParameter - 參數化查詢EntityDataReader - 唯讀、前向資料流 (如 SqlDataReader)string strConn = ConfigurationManager.ConnectionStrings["NorthwindEntities"].ConnectionString;
using (EntityConnection conn = new EntityConnection(strConn)) {
conn.Open();
using (EntityCommand cmd = conn.CreateCommand()) {
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select value c from NorthwindEntities.Categories as c";
using (EntityDataReader edr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) {
while (edr.Read()) {
result.InnerHtml += edr["CategoryName"].ToString() + "<br />";
}
}
}
}
using (EntityConnection conn = new EntityConnection("name=NorthwindEntities")) {
conn.Open();
using (EntityCommand cmd = conn.CreateCommand()) {
cmd.CommandText = "select value s from NorthwindEntities.Categories as s where s.CategoryId = @categoryId";
EntityParameter param = new EntityParameter { ParameterName = "categoryId", Value = 1 };
cmd.Parameters.Add(param);
using (EntityDataReader edr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) {
while (edr.Read()) result.InnerHtml += edr.GetString(1) + "<br />";
}
}
}
EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder();
builder.Provider = "System.Data.SqlClient";
builder.ProviderConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Northwind.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True";
builder.Metadata = @"res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl";
using (EntityConnection conn = new EntityConnection(builder.ConnectionString)) {
conn.Open();
using (EntityCommand cmd = conn.CreateCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "NorthwindEntities.GetCategory"; // 對應概念模型中的 Function Import
cmd.Parameters.Add(new EntityParameter("CategoryID", 1));
using (EntityDataReader edr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) {
while (edr.Read()) result.InnerHtml += edr["CategoryName"].ToString() + "<br />";
}
}
}
ObjectQuery<T> 代表對概念模型的查詢,支援 ESQL、LINQ 方法與查詢語法,具備延遲執行特性。
using (var ctx = new NorthwindEntities()) {
string esql = "select value c from NorthwindEntities.Categories as c";
// 方式一:CreateQuery (延遲)
ObjectQuery<Categories> query = ctx.CreateQuery<Categories>(esql);
foreach (var c in query) result.InnerHtml += c.CategoryName + "<br />";
// 方式二:ObjectQuery 建構函數 (指定 MergeOption)
ObjectQuery<DbDataRecord> query2 = new ObjectQuery<DbDataRecord>(esql, ctx, MergeOption.NoTracking);
foreach (DbDataRecord item in query2.Take(3)) result.InnerHtml += item["CategoryName"] + "<br />";
// 純量結果
ObjectQuery<int> countQuery = ctx.CreateQuery<int>("select value count(c.CategoryID) from NorthwindEntities.Categories as c");
result.InnerHtml += countQuery.First().ToString() + "<br />";
// 立即執行
ObjectResult<Categories> queryResult = query.Execute(MergeOption.NoTracking);
foreach (var c in queryResult) result.InnerHtml += c.CategoryName + "<br />";
}
| 選項 | 說明 |
|---|---|
| AppendOnly (預設) | 僅附加新實體,現有實體保持不變 |
| OverwriteChanges | 以查詢結果覆蓋現有實體 |
| PreserveChanges | 保留本地修改,僅更新未修改屬性 |
| NoTracking | 不追蹤變更,效能最佳,實體為 Detached 狀態 |
EntityClient 適合需要直接控制 ESQL、呼叫預存程序或輕量唯讀查詢的情境;ObjectQuery 則是上層應用 (LINQ to Entities、Dynamic Data) 的基礎,提供豐富的查詢組合與實體追蹤能力。完整原始碼:https://www.bianceng.net/dotnet/201212/805.htm