国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linq學習(二)-LinQ to Entity

2019-11-17 03:07:29
字體:
來源:轉載
供稿:網友

Linq學習(二)-LinQ to Entity

在昨天我學習了LinQ的一些基礎知識和動手寫了一些LinQ to Object的例子的基礎上,對于LinQ語法和基本的要點有了一定的了解。今天繼續自己的學習,對于今天學習的LinQ to DataSet 和LinQ to Entity做自己的一些總結,一方面加深自己的理解,另一方面也能掌握LinQ技術的實現機制,對于也跟我一樣對著一方面有興趣的也可以讓大家有個初步的感性認識,也是好的。

今天主要的篇幅會講解LinQ to Entity的C#實現機制以及解決昨天我看完一小節之后的兩點疑惑,后面會花一點篇幅對LinQ to DataSet做一個介紹,那具體的LinQ入門基本上就可以已經介紹完了。

看完了整個章節總結一下LinQ to Entity的實現機制,可以粗略的用下面的圖來說明:

EntityFrameWork:是一個對象-關系的映射系統,在關系數據庫與c#源代碼環境中的對象轉換起到了至關重要的作用,沒有它的LinQ to Entity估計會找不到對象吧,哈哈哈。它可以將關系數據庫中的數據庫和數據對象全部映射到LinQ to Entity的上下文環境,分別映射為一個ObjectContext類--數據庫對象;和對應的ObjectSet對象---對應的數據庫對象(表、視圖、存儲過程),然后我們通過前面學習的LinQ表達式就可以像操作對象一樣訪問數據和進行數據操作,其原理就在于關系數據庫中的表-行-字段其實都可以映射為對象。這或許就是LinQ to Entity的精髓吧。

結合上面的詳解可以更好的理解以下的簡略框架分析圖,畫的有一點丑,能理解就成了:

昨天自己學到這一塊存在一個疑問,就是LinQ相對ADO.NET的優勢在哪里呢?

在今天的學習中,關于LinQ to Entity的深入學習,了解了它的一些特點,關于其他的LinQ to DataSet/xml/Object來說,都是LinQ內存數據操作的獨有的特色,關于LinQ to Entity與ADO.net技術兩者差別都都是為了實現數據庫訪問。以下是我總結的一些區別:

共同點:都是實現數據庫訪問,LinQ to Entity也沒有提供任何不能用ADO.NET實現的特性,就是說兩個效果都可以實現,具體用什么技術看使用的場景。

區別:1、更少的代碼;LinQ to Entity不涉及數據庫底層,不需要編寫復雜的SQL語句,通過對象方式進行數據庫操作,但最后的數據庫更新都是通過SQL語句,也就是Linq 語句其實最終都會解析為SQL語句。

2、LinQ to Entity原理是通過操作緩存數據進行數據操作,最后再統一提交解析sql語句執行更細膩,所以特有的一個特點就是可以批量更新。

3、LinQ to Entity的變更跟蹤:提供了系統方法,可以跟蹤解析提交的SQL語句。

4、靈活的查詢能力;因為不是傳統的SQL語句拼接,而是使用LinQ查詢模型,可以通過一個模型訪問不同的數據庫【對于這一個特點,整個章節看完了,也沒什么場景例子作證對多個數據庫通用一個查詢模型的例子,所以可以暫時不用深究】

接下來會通過實際的例子說明通過LinQ to Entity 實現數據庫訪問:增 、刪 、改 、查詢(單表查詢、關聯查詢)

【1】首先我們需要生成一個數據模型,它是我們在源代碼環境中訪問數據庫對象的前提:

Entity FrameWork依賴于數據庫數據模型來使用LinQ查詢,表中的行被轉換為行對象的實例,每一個記錄的列被轉換為行對象的屬性。數據庫的數據模型可以通過Visual Studio來自動生成,也可以通過新增數據模型文件來手動創建映射,這次的例子采用VS生成,這樣簡單不太容易出錯。

選擇【從數據庫生成】進入下面:

點擊繼續:

測試連接通過之后,點擊確定,會生成一個連接字符串。以下有個單選項一般默認選擇【是】進入下一步:

接下來這個是比較重要的一步:我們可以看到此刻自動添加幾個dll引用,同時我們看到它將數據庫中的表間關系展現的一覽無遺,所以這也是LinQ to Entity的很神奇的地方。

結合上面直觀的數據模型圖,這里說明一下它的構架:之前系統還原,導致電腦上的Viso沒了,所以沒能用結構化的圖形做下面的說明,大家湊合著理解吧。哈哈

一個數據庫的數據模型:(1)派生對象的上下文類:也即是前面說的ObjecgContext,可以理解他就是數據庫的一個源代碼映射。

(2)實體類:也即是前面我提到的ObjectSet,就是我們剛才所選擇映射到程序的表、視圖、存儲過程的源代碼映射。

(2.1)其中實體關系跟SQL中的表關系差不多:有一對一,一對多的關系,其關聯通過上面看到的導航屬性來關聯【表外鍵】

【2】現在可以試試通過LinQ to Entity訪問我們的數據庫了。

 //前端顯示客戶表中的以下字段,今天的例子都是采用系統數據庫northWind中的數據  <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">      <Columns>         <asp:BoundField  DataField="id" HeaderText="客戶ID"/>         <asp:BoundField  DataField="name" HeaderText="客戶姓名"/>         <asp:BoundField  DataField="city" HeaderText="城市"/>         <asp:BoundField  DataField="country" HeaderText="國家"/>      </Columns>    </asp:GridView>

  1. 單表查詢:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Collections;using System.Linq;using System.Data.Objects;//obejctQuery實例的命名空間namespace LinQ{    public partial class _Default : System.Web.UI.Page    {        PRotected void Page_Load(object sender, EventArgs e)        {            //實例化數據庫對象ObjectContext            NorthwindEntities myTestDB = new NorthwindEntities();            var retRows = from customer in myTestDB.Customers                          where customer.Country == "USA"                          select new { id = customer.CustomerID,name=customer.ContactName, city = customer.City, country = customer.Country };            GridView1.DataSource = retRows;            GridView1.DataBind();                        //需要將查詢的結果轉換為ObjectQuery實例,才可以跟蹤輸出SQL語句            TextBox1.Text = (retRows as ObjectQuery).ToTraceString();        }    }}
View Code

頁面顯示效果:

轉換的SQL語句:

SELECT 1 AS [C1], [Extent1].[CustomerID] AS [CustomerID], [Extent1].[ContactName] AS [ContactName], [Extent1].[City] AS [City], [Extent1].[Country] AS [Country]FROM [dbo].[Customers] AS [Extent1]WHERE N'USA' = [Extent1].[Country]
View Code

2. 關聯查詢:前端文件也需要修改,這里就不粘貼出來了。直接看一下后端LinQ表達式。

關聯查詢可以通過兩個表達式實現:let 和 selectMany擴展方法實現,本次就let方式做演示。

let方式:

 protected void Page_Load(object sender, EventArgs e)        {            //實例化數據庫對象ObjectContext            NorthwindEntities myTestDB = new NorthwindEntities();            var retRows = from customer in myTestDB.Customers                          //let方式實現,不知道是不是為了與SQL中的左外連接一致才采用let作為關鍵字                          //不過用法很相似                          let leftTab=from order in customer.Orders //這個像不像SQL中的子查詢和組過濾表達式,哈哈&hellip;…太像了                                      select order                          where customer.Country == "USA"                          select new { id = customer.CustomerID,name=customer.ContactName, city = customer.City, country = customer.Country,orderCnt=leftTab.Count() };            GridView1.DataSource = retRows;            GridView1.DataBind();                        //需要將查詢的結果轉換為ObjectQuery實例,才可以跟蹤輸出SQL語句            TextBox1.Text = (retRows as ObjectQuery).ToTraceString();        }
View Code

轉換的SQL語句:

SELECT 1 AS [C1], [Project1].[CustomerID] AS [CustomerID], [Project1].[ContactName] AS [ContactName], [Project1].[City] AS [City], [Project1].[Country] AS [Country], [Project1].[C1] AS [C2]FROM ( SELECT     [Extent1].[CustomerID] AS [CustomerID],     [Extent1].[ContactName] AS [ContactName],     [Extent1].[City] AS [City],     [Extent1].[Country] AS [Country],     (SELECT         COUNT(1) AS [A1]        FROM [dbo].[Orders] AS [Extent2]        WHERE [Extent1].[CustomerID] = [Extent2].[CustomerID]) AS [C1]    FROM [dbo].[Customers] AS [Extent1]    WHERE N'USA' = [Extent1].[Country])  AS [Project1]
View Code

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中西区| 花莲市| 盐池县| 兴山县| 湖州市| 苏尼特右旗| 麦盖提县| 永登县| 富阳市| 扶风县| 安义县| 紫金县| 云浮市| 黄梅县| 杭州市| 息烽县| 漳浦县| 三都| 阜南县| 北辰区| 都江堰市| 丹阳市| 阳春市| 吴堡县| 南木林县| 三河市| 昆山市| 衡东县| 绩溪县| 德江县| 临湘市| 根河市| 香格里拉县| 蕉岭县| 鹿邑县| 云和县| 汝南县| 德兴市| 平湖市| 太仆寺旗| 南澳县|