日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

efcore调用函数_.net core EF Core调用存储过程的方式

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 efcore调用函数_.net core EF Core调用存储过程的方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在這里,我們將嘗試去學習一下 .net core EF Core 中調用存儲過程。

我們知道,EF Core 是不支持直接調用存儲過程的,那它又提供了什么樣的方式去執行存儲過程呢?有如下方法:

1、FromSql,官方文檔

DbSet.FromSql()

2、執行SQl命令

DbContext.Database.ExecuteSqlCommand()

但是,這兩種方式都有局限性:

1、FromSql方式的結果一定要是實體類型,就是數據庫表映射的模型。這意味著,執行存儲過程返回的結果一定是跟數據庫表相關的所有字段;

2、FromSql方式的結果不能有關聯關系數據。這就相當于不能 join ,也返回不了 join 的關聯表的數據。

3、ExecuteSqlCommand執行插入、更新跟刪除的存儲過程不能直接映射到實體(EF Core不支持嘛,在講 EF 跟 EF Core 的區別時已經很清晰了),所以,CUD 方法不能直接調用 SaveChanges 方法。

我們來試試演示一下:

(1)準備一個存儲過程,一般為了方便,直接就是 DB-First,執行以下的 SQL 腳本就OK了

USE [Library]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE PROCEDURE [dbo].[proc_getbooks]

@name nvarchar(50)

AS

BEGIN

SET NOCOUNT ON;

select * from books where name like @name +'%'

END

GO

當創建好了這個有傳參的有返回結果的存儲過程的時候,數據庫在可編程性下就有一個存儲過程了(這個數據庫是我專門用來做demo的)

(2)用 FromSql 調用存儲過程,由上面就可以知道它是 DbSet 的方法,而 DbSet 是可以執行原生的 sql 語句去查詢底層的數據庫。同樣,使用 DbSet 可以執行存儲過程,從而返回實體類型,但就是具有上面所說的局限性罷了。

//用 FromSql 調存儲過程

var name = "C";

var books = _context.Books

.FromSql($"proc_getbooks {name}")

.ToList();

//or 使用 exec 關鍵字調用存儲過程

//var books = _context.Books.FromSql($"exec proc_getbooks {name}").ToList();

//or 使用 SqlParameter 實例進行參數的插入

//var param = new SqlParameter()

//{

// ParameterName = "@name",

// SqlDbType = System.Data.SqlDbType.NVarChar,

// Direction = System.Data.ParameterDirection.Input,

// Size = 50,

// Value = name

//};

//or 使用 @p0 代表第一個參數,則 @p1 就代表第二個參數等以此類推

//var books = _context.Books.FromSql("proc_getbooks @p0", name).ToList();

同樣,在這里值得一提的是,當我們多次調用同一個存儲過程,傳遞同樣的參數的時候,比如像下面:

//用 FromSql 多次調同一個存儲過程

var name = "C";

var list1 = _context.Books.FromSql($"proc_getbooks {name}").ToList();

var list2 = _context.Books.FromSql($"proc_getbooks {name}").ToList();

var list3 = _context.Books.FromSql($"proc_getbooks {name}").ToList();

所有的實體默認(可以設置)都會被 DbContext 進行跟蹤。如果你執行同樣的存儲過程,傳同樣的參數的時候,進行多次執行的時候,相當于執行同樣的 sql 語句多次,但返回的結果確認一樣的, 根據DbContext 的跟蹤,直接就獲取緩存進行返回結果了。就是說,存儲過程會被調用多次,但只查了一次數據庫,其他的在緩存里拿數據。

(3)用ExecuteSqlCommand 調用存儲過程,這個跟 EF 是一個毛樣的,由于要測試的話,還要創建一個存儲過程,因為這個執行查詢沒有意義,如果你看它的返回的話,都是 int 類型,而且返回結果都是影響的行數。

看看源碼:

其實 ExecuteSqlCommand 最終是調用 ExecuteNonQuery,就是執行非查詢的語句,返回影響的行數,也驗證了剛才所說的。

扯遠了,那么再創建一個存儲過程吧

CREATE PROCEDURE [dbo].[proc_createbook]

@name Varchar(50),

@author Varchar(50),

@cateid int

AS

BEGIN

SET NOCOUNT ON;

Insert into books(

[name]

,[author]

,[createtime]

,[isdel]

,[cateid]

)

Values (@name, @author,GETDATE(),0,@cateid)

END

GO

創建后

來調用以下試試:

//用 ExecuteSqlCommand 調存儲過程, 用parameters: new[] {}也是可以的

var name = "C# 高級進階";

var author = "-";

var cateid = 1;

_context.Database.ExecuteSqlCommand("proc_createbook @p0,@p1,@p2", name, author, cateid);

執行結果:

OK,是可以執行成功的。

到這里先完成第一部分先,接下來就做調用存儲過程的擴展,因為單靠這兩種調用方式,我們是不會滿足的!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。

時間: 2019-05-06

總結

以上是生活随笔為你收集整理的efcore调用函数_.net core EF Core调用存储过程的方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。