這一節,咱們來看看EF如何執行SQL語句與讀取存儲過程的數據,可能有一部分人,還不知道EF如何執行存儲過程與原生SQL語句!sql
咱們何時要直接使用原生的SQL語句?數據庫
因此實際開發中,我每每兩合一處理異步
EF上下文 DbContext包含了DataBase屬性,裏面有不少方法,可是實際咱們只須要用到個方法函數
別小看這兩個方法,他們其實有不少重載,不過操做咱們以往的ADO.NET基本無異!性能
下面來看MSDN對於這兩個方法的描述,咱們直接看代碼的描述就好,一看就是咱們熟悉的ADO.NET操做方式ui
context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
context.Database.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
咱們經過一個小例子來,來使用這2個方法spa
新建一個項目,並新增一個EF,並加入表InfoTest3d
CREATE TABLE [dbo].[InfoTest]( [Id] [varchar](50) PRIMARY key, [Name] [varchar](50) NULL, [Phone] [varchar](50) NULL, [CreateTime] [datetime] NULL, )
static void Main(string[] args) { using (DBContainer db = new DBContainer()) { //---------執行一條語句,帶參數 string sql = "INSERT INTO [dbo].[InfoTest]([Id],[Name],[Phone],[CreateTime])VALUES(@Id,@Name,@Phone,@CreateTime)"; SqlParameter[] para = new SqlParameter[] { new SqlParameter("@Id",Guid.NewGuid().ToString()), new SqlParameter("@Name","中國移動"), new SqlParameter("@Phone","10086"), new SqlParameter("@CreateTime",DateTime.Now), }; //返回執行的影響行 int count = db.Database.ExecuteSqlCommand(sql,para); Console.WriteLine("新增-帶參數"+count); //----------執行一條語句,不帶參數 sql = "Delete [dbo].[InfoTest] where Name='中國移動'"; count = db.Database.ExecuteSqlCommand(sql); Console.WriteLine("刪除不帶參數" + count); } }
注:帶參數能夠防止SQL注入,仍是帶參數好code
sql = "select * from InfoTest"; DbRawSqlQuery<InfoTest> dbRaw = db.Database.SqlQuery<InfoTest>(sql);
執行查詢的語句,會返回 DbRawSqlQuery咱們須要將其轉換爲咱們熟悉的 IQueryable 或者 List來作進一步的數據庫處理blog
如:ExecuteSqlCommandAsync
來看一個簡單的存儲過程
CREATE PROCEDURE SP_GetInfoTest @Phone varchar(50) AS BEGIN select * from InfoTest where Phone=@Phone END GO
經過電話號碼查一條記錄,咱們須要經過EF傳過來參數,而後接收起返回值
看了上面的朋友,應該知道能夠能夠用使用SqlQuery來查詢,沒錯,就是能夠這樣!
可是有時候咱們仍是要寫存儲過程,好比你的代碼有幾百行,那麼用存儲過程頁面的代碼看起來就好多了
把建立好的存儲過程加入EF【右鍵更新模型】
如今的EF很聰明瞭,幫咱們生成了返回值和函數導入,直接拿來使用就好
//使用存儲過程 List<SP_GetInfoTest_Result> spResult = db.SP_GetInfoTest("1008612").ToList(); //進一步的操做 foreach (var r in spResult) { Console.Write("來自存儲過程的數據:"+r.Name + r.Phone); }
參考:
Database這個類很強大。有事務,和其餘方法,也是很是實用,能夠了解一下
https://msdn.microsoft.com/zh-cn/library/system.data.entity.database(v=vs.113).aspx
代碼下載:連接:https://pan.baidu.com/s/1qZ964fM 密碼:hlyp