MVC EF 執行SQL語句(轉載)

来源:https://www.cnblogs.com/hao-1234-1234/archive/2018/04/10/8776645.html
-Advertisement-
Play Games

MVC EF 執行SQL語句 最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。 十年河東十年河西,莫欺少年窮 學無止境,精益求精 閑著沒事,看了一篇關於LINQ和SQL對比的文章,網友們也是積極發言,有人說LINQ簡單,維護了程式的可讀性,易用性。有人說: ...


MVC EF 執行SQL語句

 

 

最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

十年河東十年河西,莫欺少年窮

學無止境,精益求精

閑著沒事,看了一篇關於LINQ和SQL對比的文章,網友們也是積極發言,有人說LINQ簡單,維護了程式的可讀性,易用性。有人說:LINQ的執行本質其實就是SQL,再好的LINQ也需要轉化為SQL後才能和資料庫交互,LINQ效率低。

在此,表達下觀點:本人支持後者,也就是SQL。

那麼,在EF中,我們怎樣執行SQL呢?

在此,先貼出幾張圖,如下:

1、

 

2、

 

3、

4、

根據上圖,我們得知,圖一,圖二兩個方法執行返回Int的方法,諸如:Insert操作,Update操作,delete操作。圖三,圖四返回DbRawSqlQuery的方法,諸如:Select操作。

何為DbRawSqlQuery類型?如下:

由此可見DbRawSqlQuery類型繼承自泛型類型。因此,圖三圖四用於執行Select操作的SQL語句。

那麼,我們該怎麼使用呢?

圖一示例

db.Database.ExecuteSqlCommand("delete語句 或 Update語句 或 Insert語句 ");
db.Database.ExecuteSqlCommand("delete語句 或 Update語句 或 Insert語句 ",params object[] parameters);
複製代碼
        /// <summary>
        /// 學生Id
        /// </summary>
        /// <param name="i"></param>
        public StudentScore()
        {
            using (StudentContext db = new StudentContext())
            {
                int userid = 8;
                string name = "Jack";
                SqlParameter[] paras = new SqlParameter[] {
                     new SqlParameter("@userId",userid),
                     new SqlParameter("@searchName",name)
                    };
                db.Database.ExecuteSqlCommand("delete from S where userId=@userId or UserName=@searchName", paras);
            }

        }
複製代碼

圖二實際上是執行存儲過程:

複製代碼
        public StudentScore()
        {
            using (StudentContext db = new StudentContext())
            {
                db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,"exec ProcName ");
            }
        }
複製代碼

圖三、圖四執行查詢操作,如下所示:

複製代碼
    public class StudentScore
    {
        public IEnumerable<Student> StudentModel { get; set; }//
        public IEnumerable<Course> CourseModel { get; set; }
        public IEnumerable<Score> ScoreModel { get; set; }
        //
        public List<StudentScoreVM> StudentScoreList = new List<StudentScoreVM>();

        public StudentScore()
        {
        }
        /// <summary>
        /// 學生Id
        /// </summary>
        /// <param name="i"></param>
        public StudentScore(int Id)
        {
            using (StudentContext db = new StudentContext())
            {
                //返回StudentScoreVM對象集合 通過這種方式可實現ViewModel特性
                StudentScoreList = db.Database.SqlQuery<StudentScoreVM>("select A.StudentScore,B.Name courseName,C.Name stuName,C.Sex,C.StudentAddress,C.StudentNum from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
                //返回查詢結果的課程名集合
                var stringList = db.Database.SqlQuery<string>("select B.Name courseName from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
                //返回查詢結果的年齡集合
                var intList= db.Database.SqlQuery<string>("select A.Age from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
            }
        }
    }
複製代碼

總結如下:

通過 SQL 查詢語句獲取實體對象集

DbSet 類中的 SqlQuery 方法允許你執行一個返回實體對象集的原生 SQL 查詢. 預設情況下, 返回的對象集會被上下文跟蹤; 這可以通過對方法返回的 DbSqlQuery 對象調用 AsNoTracking 方法取消.返回的結果集一般為 DbSet 所對應的類型, 否則即便是其派生類也無法返回. 如果所查詢的表包含了其他實體類型的數據, 那麼所執行的 SQL 語句應該被正確書寫, 保證只返回指定類型實體的數據. 下麵的例子使用 SqlQuery 方法執行了一個 SQL 查詢, 返回一個 Department 類型的實例集.

讓資料庫執行原生的非查詢 SQL 命令

ExecuteSqlCommand 方法有時會被用在 Code First 創建的資料庫的初始化函數中, 用來對資料庫進行一些額外的配置 (例如, 設置索引). 需要註意的是, 上下文對象並不知道執行了 ExecuteSqlCommand 方法後資料庫中的數據有什麼改變, 除非你從資料庫中載入或重新載入實體集.

 

調用存儲過程

Code First 並不支持對存儲過程的映射. 但是, 你可以通過 ExecuteSqlCommand 或 SqlQuery 方法直接調用存儲過程. 例如: context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").

譯註: 本文提到的三個方法 (DbSet.SqlQuery, Database.SqlQuery, Database.ExecuteSqlCommand) 都支持參數化查詢, 用法和 string.Format 類似, 但是在查詢執行時會對傳入的參數進行類型轉換. 如: context.Departments.SqlQuery("select * from Department where DepartmentID = {0}", "6"); 該語句執行時, 會將字元串 "6" 轉化為整數然後再代入查詢語句中執行, 可以有效防止 SQL 註入.

防止 SQL 註入攻擊

應用程式經常要從外部獲取輸入 (來自用戶和其他外部代理) , 然後根據這些輸入執行相關操作. 從用戶或外部代理直接或間接獲取的任何信息都可能利用目標程式語言的語法來執行違法操作. 當目標語言是結構化查詢語言 (SQL) 時, 例如 Transact-SQL, 這個操作被稱為 SQL 註入攻擊. 惡意的用戶可以直接在查詢中註入命令執行操作, 刪除資料庫中的一個表, 拒絕提供服務或修改正在執行的操作的性質. 故你應該使用參數化的查詢, 而不是直接將從外部獲取的字元串插入到查詢字元串中.

 

轉載來源:https://www.cnblogs.com/chenwolong/p/SqlQuery.html


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

-Advertisement-
Play Games
更多相關文章
  • MVC和三層架構 (有錯誤的話歡迎來噴,沒包袱) 一、概念 1、 MVC 最初的概念 輸入(控制器)、輸出(視圖)、邏輯處理(模型) 2、 三層架構 是對原始MVC概念中邏輯處理層(模型層)的進一步劃分,分UI-業務邏輯BLL-數據訪問DAL。三層里的模型是數據模型,與資料庫對應 但如今 MVC與三 ...
  • 上一篇文章中我們學習了列表頁面的結構,@page與@model兩個關鍵Razor指令,以及頁面佈局應該修改哪裡。這一篇文章我們來學習一下新建頁面。 ...
  • 本文的概念性內容來自深入淺出設計模式一書. 上一篇文章講了簡單工廠和工廠方法設計模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披薩店的例子. 文將繼續使用這個例子, 這裡要用到抽象工廠. 披薩店的需求變更 現在披薩店在各地授權了很多連鎖分店, ...
  • 第一種方法: 後臺: 前臺: 此方法為泛型方法封裝,每次用時,都要寫一個轉換器,如:LogicalOperatorEnumConverter 。 第二種方法: 寫一個固定的類: 將Enum轉成ObservableCollection<ComboBoxDataModel> /// <summary> ...
  • 概述 UWP Community Toolkit Extensions 中有一個為 Mouse 提供的擴展 - Mouse Cursor Extensions,本篇我們結合代碼詳細講解 Mouse Cursor Extensions 的實現。 Mouse Cursor Extensions 為 Fr ...
  • 說明 目前正在做的項目批次功能涉及第三方插件,而第三方插件需依賴4. 版本的Newtonsoft.Json.dll,由於現有功能已經使用6. 版本的Newtonsoft.Json.dll,故採用了dll共存的方法來適應項目需求。 • 方案 1.首先對比下2個版本的dll文件對應publicKeyTo ...
  • .net MVC使用Session驗證用戶登錄 用最簡單的Session方式記錄用戶登錄狀態 1.添加DefaultController控制器,重寫OnActionExecuting方法,每次訪問控制器前觸發 public class DefaultController : Controller { ...
  • EF中使用SQL語句或存儲過程 1、無參數查詢 var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToList(); 2、有參查詢 var model = db.Database.SqlQuery<UserI ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...