.NET訪問資料庫的兩種方式(C#語言)

来源:http://www.cnblogs.com/chrisluo/archive/2017/08/11/7348423.html
-Advertisement-
Play Games

一、直接使用C#操作資料庫的類庫ADO.NETADO.NET使用Connection對象來連接資料庫,使用Command或DataAdapter 對象來執行SQL語句,並將執行的結果返回給DataReader或DataAdapter,然後 再使用取得的DataReader或者DataAdapter對 ...


一、直接使用C#操作資料庫的類庫ADO.NET
ADO.NET使用Connection對象來連接資料庫,使用Command或DataAdapter
對象來執行SQL語句,並將執行的結果返回給DataReader或DataAdapter,然後
再使用取得的DataReader或者DataAdapter對象操作數據結果。

二、Entity Framework
Entity Framework 實體框架是微軟的一個ORM框架。是支持面向數據的軟體開
發應用程式。我們一般配合linq和lambda表達式使用。

ORM((Object Relational Mapping對象關係映射)指的是面向對象的對象模型和
關係型資料庫的數據結構之間的互相轉換。(表實體跟表之間的相互轉換)

LINQ查詢:當我們使用linq查詢時,轉到定義會調到Queryable 類, 那麼也就是
說,這個類封裝了linq所有查詢的方法,提供一組用於查詢實現 IQueryable<T>
的數據結構的 靜態方法。
IQueryable和IList一樣,是用於接收一組數據的集合, IQeurable
(IQuerable<T>)不會立即在記憶體里創建持久數據,只有遍歷它(如通過
foreach)、把它轉換成List等情況下才會向記憶體載入數據,它可以實現“延期執
行”,如果當前被載入的實體有關聯實體(associations),此關聯實體可被接下
來的訪問載入。

Ilist-繼承順序如下:
Ilist->ICollection ->IEnumerable
IEnumerable它允許開發人員定義foreach語句功能的實現並支持非泛型方法的簡
單的迭代
同樣的IQueryable也繼承自IEnumerable<T>這一泛型介面

Queryable類提供了擴展的基本查詢方法:Where,Select
select提供方法如下:
public static IQueryable<TResult> Select<TSource, TResult>(this
IQueryable<TSource> source, Expression<Func<TSource, TResult>>
selector);
where提供的方法如下:
public static IQueryable<TSource> Where<TSource>(this
IQueryable<TSource> source, Expression<Func<TSource, bool>>
predicate);
public static IQueryable<TSource> Where<TSource>(this
IQueryable<TSource> source, Expression<Func<TSource, int, bool>>
predicate);

Lambda表達式

(1)源起.net的設計者發現在使用匿名方法時,仍舊有一些多餘的字母或單詞的編碼工作

比如delegate關鍵字於是進一步簡化了匿名方法的寫法。

(2)使用      
List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
arr.ForEach(new Action<int>(delegate(int a) { Console.WriteLine
(a); }));
arr.ForEach(new Action<int>(a => Console.WriteLine(a)));
      匿名方法的代碼如下:
      delegate(int a) { Console.WriteLine(a); }
      使用lambda表達式的代碼如下:
      a => Console.WriteLine(a)
      這裡解釋一下這個lambda表達式
      <1>
        a是輸入參數,編譯器可以自動推斷出它是什麼類型的,
        如果沒有輸入參數,可以寫成這樣:
        () => Console.WriteLine("ddd")
      <2>
        =>是lambda操作符
      <3>
        Console.WriteLine(a)是要執行的語句。
        如果是多條語句的話,可以用{}包起來。
        如果需要返回值的話,可以直接寫return語句

LINQ
1.查詢操作符
  (1)源起
      .net的設計者在類庫中定義了一系列的擴展方法
      來方便用戶操作集合對象
      這些擴展方法構成了LINQ的查詢操作符
    (2)使用
      這一系列的擴展方法,比如:
      Where,Max,Select,Sum,Any,Average,All,Concat等
      都是針對IEnumerable的對象進行擴展的
      也就是說,只要實現了IEnumerable介面,就可以使用這些擴展方法
      來看看這段代碼:      
List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
var result = arr.Where(a => { return a > 3; }).Sum();
Console.WriteLine(result);
Console.ReadKey();
      這段代碼中,用到了兩個擴展方法。
(3)好處
      上面的代碼中
      arr.Where(a => { return a > 3; }).Sum();
      這一句完全可以寫成如下代碼:
      (from v in arr where v > 3 select v).Sum();
      而且兩句代碼的執行細節是完全一樣的
      大家可以看到,第二句代碼更符合語義,更容易讀懂
      第二句代碼中的where,就是我們要說的查詢操作符。
    (4)標準查詢操作符說明
      <1>過濾
        Where
        用法:arr.Where(a => { return a > 3; })
        說明:找到集合中滿足指定條件的元素
        OfType
        用法:arr.OfType<int>()
        說明:根據指定類型,篩選集合中的元素
      <2>投影
       Select
        用法:arr.Select<int, string>(a => a.ToString());
        說明:將集合中的每個元素投影的新集合中。上例中:新集合是
一個IEnumerable<String>的集合
        SelectMany
        用法:arr.SelectMany<int, string>(a => { return new
List<string>() { "a", a.ToString() }; });
        說明:將序列的每個元素投影到一個序列中,最終把所有的序列
合併
      <3>還有很多查詢操作符,請翻MSDN,以後有時間我將另起一篇文
章把這些操作符寫全。

2.查詢表達式
    (1)源起
      上面我們已經提到,使用查詢操作符表示的擴展方法來操作集合;
      雖然已經很方便了,但在可讀性和代碼的語義來考慮,仍有不足;
      於是就產生了查詢表達式的寫法。
      雖然這很像SQL語句,但他們卻有著本質的不同。
    (2)用法
      from v in arr where v > 3 select v
      這就是一個非常簡單的查詢表達式
    (3)說明:
      先看一段偽代碼:      
      from [type] id in source
      [join [type] id in source on expr equals expr [into
subGroup]]
      [from [type] id in source | let id = expr | where condition]
      [orderby ordering,ordering,ordering...]
      select expr | group expr by key
      [into id query]
      <1>第一行的解釋:
        type是可選的,
        id是集合中的一項,
        source是一個集合,
        如果集合中的類型與type指定的類型不同則導致強制類型轉化
      <2>第二行的解釋:        
        一個查詢表達式中可以有0個或多個join子句,
        這裡的source可以是一個全新的集合,可以不等於第一句中的
source
        expr可以是一個表達式
        [into subGroup] subGroup是一個中間變數,
        它繼承自IGrouping,代表一個分組,也就是說“一對多”里的
“多”
        可以通過這個變數得到這一組包含的對象個數,以及這一組對象
的鍵
        比如:        
        from c in db.Customers
    join o in db.Orders on c.CustomerID
    equals o.CustomerID into orders
    select new
    {
    c.ContactName,
    OrderCount = orders.Count()
    };
      <3>第三行的解釋:     
        一個查詢表達式中可以有1個或多個from子句
        一個查詢表達式中可以有0個或多個let子句,let子句可以創建一
個臨時變數
        比如:        
    from u in users
    let number = Int32.Parse(u.Username.Substring
(u.Username.Length - 1))
    where u.ID < 9 && number % 2 == 0
    select u
        一個查詢表達式中可以有0個或多個where子句,where子句可
以指定查詢條件
      <4>第四行的解釋:
        一個查詢表達式可以有0個或多個排序方式
        每個排序方式以逗號分割
      <5>第五行的解釋:
        一個查詢表達式必須以select或者group by結束
        select後跟要檢索的內容
        group by 是對檢索的內容進行分組
        比如:        
    from p in db.Products
    group p by p.CategoryID into g
    select new { g.Key, NumProducts = g.Count()};
      <6>第六行的解釋:
        最後一個into子句起到的作用是
        將前面語句的結果作為後面語句操作的數據源
        比如:        
    from p in db.Employees
    select new
    {
    LastName = p.LastName,
    TitleOfCourtesy = p.TitleOfCourtesy
    } into EmployeesList
    orderby EmployeesList.TitleOfCourtesy ascending
    select EmployeesList;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當設置粘著位時只有root或者owner才能刪除、重命名文件。 示例: 用戶apple預設組為fruit。 [root@titan ~]# id apple uid=1001(apple) gid=1001(fruit) 組=1001(fruit) step1 顯示water文件夾信息,文件夾當前未 ...
  • 1.安裝 sudo apt-get install python-virtualenv 2.使用 創建虛擬環境: virtualenv [虛擬環境名稱] 例如: virtualenv python27 激活使用虛擬環境: source ~/workplace/python27/bin/activat ...
  • centos7安裝過程中如果沒有創建用戶的話,預設只有ROOT用戶,這個用戶是具有最高許可權的帳戶,可以做任何事情,但實際生產環境中我們一般不會使用這個用戶,因為許可權太大了,很危險。 所以在生產環境中就要創建一個或多個用戶帳戶,分配合適的許可權來使用,用過windows的都知道,windows也是多用戶 ...
  • 1、背景 1) 一個作為伺服器端:VM3(IP: 3.9.8.151) 2) 一個作為客戶端:VM2(IP: 3.9.8.157) 3) 伺服器端和客戶端網路能夠互相ping通 4) 伺服器端和客戶端都已安裝 rsync 要求:將VM3的/root/backup/目錄下的所有文件 複製到 VM2 的 ...
  • while迴圈 語法1: while [ 條件 ] do 命令序列 done 語法2: while read -r line do 命令序列 done (切記while和左中括弧一定要有空格) 例子 if判斷語句 語法1: if 條件 then 命令序列 fi 語法2: if 條件 then 條件序 ...
  • 1 、rsync介紹 rsync是實現全量及增量的本地或遠程數據鏡像同步備份的工具 rsync常用命令參數 2、rsync特性 ①支持拷貝特殊文件如軟鏈接,設備等 ②排除指定文件或目錄同步的功能,相當於打包命令tar排除功能 ③ 保持原文件或目錄的許可權、時間、硬鏈接、屬主、組等屬性不改變 ④實現增量 ...
  • 輸出重定向 重定向一般通過在命令間插入特定的符號來實現。特別的,這些符號的語法如下所示 command1 > file1 上面這個命令執行command1然後將輸出的內容存入file1。 註意任何file1內的已經存在的內容將被新內容替代。如果要將新內容添加在文件末尾,請使用>>操作符。 實例 執行 ...
  • 1. 引言 由於實習生轉正,公司給配了一臺新電腦,配置不用多說,16G記憶體,i7 7700的CPU,128SSD的系統盤,1T的機械硬碟,雖然只有一個破核顯。對於我個人而言,最重要的是系統從Windows7企業版升級到Windows10企業版,成為公司第一批使用Windows10的員工。 2. 在B ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...