首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

VS 2008 SP1 + .NET 3.5 SP1 (4) - Entity Framework EntityClient 與 ObjectQuery

     編輯:關於.NET

EntityClient 提供者模式

EntityClient 是 ADO.NET Entity Framework 的資料提供者,類似 SqlClient,但針對概念模型 (EDM) 操作,支援 Entity SQL。

核心類別

  • EntityConnection - 連接儲存模型
  • EntityCommand - 執行 ESQL 命令或預存程序
  • EntityParameter - 參數化查詢
  • EntityDataReader - 唯讀、前向資料流 (如 SqlDataReader)

基本查詢範例 - EntityClient.aspx.cs

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 延遲查詢與執行

ObjectQuery<T> 代表對概念模型的查詢,支援 ESQL、LINQ 方法與查詢語法,具備延遲執行特性。

建立與執行 ObjectQuery

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 />";
}

MergeOption 合併選項

選項說明
AppendOnly (預設)僅附加新實體,現有實體保持不變
OverwriteChanges以查詢結果覆蓋現有實體
PreserveChanges保留本地修改,僅更新未修改屬性
NoTracking不追蹤變更,效能最佳,實體為 Detached 狀態

總結

EntityClient 適合需要直接控制 ESQL、呼叫預存程序或輕量唯讀查詢的情境;ObjectQuery 則是上層應用 (LINQ to Entities、Dynamic Data) 的基礎,提供豐富的查詢組合與實體追蹤能力。完整原始碼:https://www.bianceng.net/dotnet/201212/805.htm

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved