天天看點

再接再厲VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(實體架構)之EntityClient, ObjectQuery

<a href="http://webabcd.blog.51cto.com/1787395/341154" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/99915">[源碼下載下傳]</a>

再接再厲VS 2008 sp1 + .NET 3.5 sp1(4) - Entity Framework(實體架構)之EntityClient, ObjectQuery

介紹

以Northwind為示例資料庫,ADO.NET Entity Framework之詳解EntityClient, ObjectQuery

EntityConnection - 與存儲模型的連接配接

EntityCommand - 對 EDM 執行的指令

EntityParameter - 配置 EntityCommand 的參數

EntityDataReader - 以隻讀、隻進的資料流的方式擷取資料(記憶體中始終隻有一行)。相當于SqlDataReader

ObjectQuery&lt;T&gt; - 通過 Entity SQL 或 查詢文法 或 Linq 方法對概念模型做查詢

ObjectContext.CreateQuery&lt;T&gt;(Entity SQL) - 根據 esql 建立一個 ObjectQuery&lt;T&gt; 。(延遲)

示例

1、關于EntityClient

EntityClient.aspx.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Web; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

using System.Data.Objects; 

using System.Data.Objects.DataClasses; 

using System.Data.EntityClient; 

using System.Data; 

using VS2008SP1.Business; 

public partial class EntityFramework_EntityClient : System.Web.UI.Page 

void Page_Load() void Page_Load(object sender, EventArgs e) 

        { 

                if (!Page.IsPostBack) 

                { 

                        Demo(); 

                        result.InnerHtml += "&lt;br /&gt;"; 

                        Demo2(); 

                        Demo3(); 

                } 

        } 

        void Demo() 

                string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindEntities"].ConnectionString; 

                // EntityConnection - 與存儲模型的連接配接。構造函數的參數為連接配接字元串 

                //         Open() - 打開連接配接 

                //         Close() - 關閉連接配接 

                //         CreateCommand() - 建立此連接配接的 EntityCommand 對象 

                using (EntityConnection conn = new EntityConnection(strConn)) 

                        conn.Open(); 

                        try 

                        { 

                                // EntityCommand - 對 EDM 執行的指令 

                                //         CommandType - 指令類型 [System.Data.CommandType枚舉] 

                                //                 CommandType.Text - esql語句。預設值 

                                //                 CommandType.StoredProcedure - 存儲過程名 

                                //                 CommandType.TableDirect - 表名 

                                //         CommandText - 指令文本。esql語句或存儲過程名或表名 

                                //         CommandTimeout - 逾時時間。機關:秒 

                                using (EntityCommand cmd = conn.CreateCommand()) 

                                { 

                                        cmd.CommandType = CommandType.Text; 

                                        cmd.CommandText = "select value c from NorthwindEntities.Categories as c"; 

                                        // EntityDataReader - 以隻讀、隻進的資料流的方式擷取資料(記憶體中始終隻有一行)。相當于SqlDataReader 

                                        //         Read() - 讀下一條記錄 

                                        //         HasRows() - 是否還有可讀資料 

                                        //         Close() - 關閉 EntityDataReader 

                                        // EntityCommand.ExecuteReader() - 執行指令,傳回 EntityDataReader 對象 

                                        using (EntityDataReader edr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) 

                                        { 

                                                while (edr.Read()) 

                                                { 

                                                        result.InnerHtml += edr["CategoryName"].ToString() + "&lt;br /&gt;"; 

                                                } 

                                        } 

                                } 

                        } 

                        catch (Exception ex) 

                                result.InnerHtml += ex.ToString(); 

                        finally 

                                conn.Close(); 

                /**//* 

                SELECT    

                [Extent1].[CategoryID] AS [CategoryID],    

                [Extent1].[CategoryName] AS [CategoryName],    

                [Extent1].[Description] AS [Description],    

                [Extent1].[Picture] AS [Picture] 

                FROM [dbo].[Categories] AS [Extent1] 

                */ 

        void Demo2() 

                // EntityConnection 構造函數的參數為 name = web.config中的connectionStrings中配置的連接配接字元串的name 

                using (EntityConnection conn = new EntityConnection("name = NorthwindEntities")) 

                                        cmd.CommandText = "select value s from NorthwindEntities.categories as s where s.categoryId = @categoryId"; 

                                        // EntityParameter - 配置 EntityCommand 的參數 

                                        //         ParameterName - 參數名 

                                        //         Value- 參數值 

                                        //         Size - 參數大小 

                                        //         DbTyp - 參數類型 [System.Data.DbType 枚舉] 

                                        //         IsNullable - 是否接受 null 值 

                                        EntityParameter param = new EntityParameter(); 

                                        param.ParameterName = "categoryId"; 

                                        param.Value = 1; 

                                        // EntityCommand.Parameters.Add() - 為 EntityCommand 增加參數 

                                        cmd.Parameters.Add(param); 

                                                        result.InnerHtml += edr.GetString(1) + "&lt;br /&gt;"; 

                exec sp_executesql N'SELECT    

                WHERE [Extent1].[CategoryID] = @categoryId',N'@categoryId int',@categoryId=1 

        void Demo3() 

                // EntityConnectionStringBuilder - 構造連接配接字元串 

                EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 

                entityBuilder.Provider = "System.Data.SqlClient"; 

                entityBuilder.ProviderConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Northwind.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True"; 

                entityBuilder.Metadata = @"res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl"; 

                using (EntityConnection conn = new EntityConnection(entityBuilder.ConnectionString)) 

                                        // 調用存儲過程(需要先做好映射,然後指定概念模型中的函數名稱) 

                                        cmd.CommandType = CommandType.StoredProcedure; 

                                        cmd.CommandText = "NorthwindEntities.GetCategory"; 

                                        param.ParameterName = "CategoryID"; 

                exec [dbo].[spSelectCategory] @CategoryID=1    

}

2、關于ObjectQuery

ObjectQuery.aspx.cs

using System.Data.Common; 

public partial class EntityFramework_ObjectQuery : System.Web.UI.Page 

                        Demo4(); 

void Demo() void Demo() 

                using (var ctx = new NorthwindEntities()) 

                        string esql = "select value c from NorthwindEntities.Categories as c"; 

                        // ObjectQuery&lt;T&gt; - 通過 Entity SQL 或 查詢文法 或 Linq 方法對概念模型做查詢 

                        // ObjectContext.CreateQuery&lt;T&gt;(Entity SQL) - 根據 esql 建立一個 ObjectQuery&lt;T&gt; 。(延遲) 

                        ObjectQuery&lt;Categories&gt; query = ctx.CreateQuery&lt;Categories&gt;(esql); 

                        foreach (var c in query) 

                                result.InnerHtml += c.CategoryName + "&lt;br /&gt;"; 

void Demo2() void Demo2() 

                        string esql = "select c.CategoryName from NorthwindEntities.Categories as c"; 

                        // ObjectQuery&lt;T&gt;()構造函數 - 根據 esql 建立一個 ObjectQuery ,傳回 DbDataRecord 。(延遲) 

                        // System.Data.Objects.MergeOption枚舉 - 如何将此次查詢結果與之前同一 ObjectContext 的存在與記憶體的查詢結果做合并 

                        //         MergeOption.AppendOnly - 追加。預設值 

                        //         MergeOption.OverwriteChanges - 以新結果為準 

                        //         MergeOption.PreserveChanges - 以原結果為準 

                        //         MergeOption.NoTracking - 取消變更跟蹤,不會使用 ObjectStateManager,減少執行查詢的時間,所有傳回的實體将是分離的狀态(detached state) 

                        ObjectQuery&lt;DbDataRecord&gt; query = new ObjectQuery&lt;DbDataRecord&gt;(esql, ctx, MergeOption.NoTracking); 

                        // 可以在 ObjectQuery&lt;T&gt; 上使用 Linq 方法或查詢文法 

                        foreach (DbDataRecord item in query.Take(3)) 

                                result.InnerHtml += item["CategoryName"].ToString() + "&lt;br /&gt;"; 

                [Limit1].[C1] AS [C1],    

                [Limit1].[CategoryName] AS [CategoryName] 

                FROM ( SELECT TOP (3)    

                        [Extent1].[CategoryName] AS [CategoryName],    

                        1 AS [C1] 

                        FROM [dbo].[Categories] AS [Extent1] 

                )    AS [Limit1] 

void Demo3() void Demo3() 

                        string esql = "select value count(c.CategoryID) from NorthwindEntities.Categories as c"; 

                        // ObjectQuery&lt;簡單類型&gt; 的示例(延遲) 

                        ObjectQuery&lt;int&gt; query = ctx.CreateQuery&lt;int&gt;(esql); 

                        result.InnerHtml += query.First().ToString() + "&lt;br /&gt;"; 

                [Limit1].[A1] AS [C1] 

                FROM ( SELECT TOP (1)    

                        COUNT([Extent1].[CategoryID]) AS [A1] 

                )    AS [Limit1]    

void Demo4() void Demo4() 

                        // 延遲 

                        // ObjectQuery&lt;T&gt;.Execute() - 立即執行查詢。傳回 ObjectResult&lt;T&gt; 

                        ObjectResult&lt;Categories&gt; queryResult = query.Execute(MergeOption.NoTracking); 

                        foreach (var c in queryResult) 

                FROM [dbo].[Categories] AS [Extent1]    

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/341462,如需轉載請自行聯系原作者