EntityFramework儲存過程的返回型別

2022-02-04 02:15:15 字數 1963 閱讀 1185

使用entityframework可以很方便的與資料庫打交道,但是對於儲存過程,返回型別很讓人糾結,預設只返回受影響的行數,而我們在使用儲存過程時往往是會返回一串的資料或者乙個表。那有沒有什麼方法呢?

我們知道在sql2008是支援表型別的,如果儲存過程在執行完成後返回了乙個表型別,在ef端再接收一下,那是不是就可以了呢?事實證明是可行的。我們需要分幾個步驟。

1.在資料庫中建立乙個表型別,比如叫key_value型別。

-- create the data type

create type key_value as table

( [key] nvarchar(50),

[value] nvarchar(max),

[remark] nvarchar (max)

)go

如下圖

2.儲存過程

假定我們需要傳入乙個字串的過濾條件,那麼我們的儲存過程可以定義乙個引數,之後再拼接成sql,使用exec來執行,同時把結果存入到表型別變數中。

create procedure [dbo].[querystudent]

@wherestr nvarchar(max) --根據需要定義的where條件

asbegin

declare @temp_table key_value

declare @sql nvarchar(max)

set @sql=' select st_guid as [key], st_name as [value],st_hobby as [remark] from student where '+@wherestr

insert into @temp_table exec(@sql)

select [key] as [guid],[value] as [name],[remark] as [hobby] from @temp_table

end

3.ef端

ef端連到資料庫後,將儲存過程querystudent加入到模型中,結果如下圖

在儲存過程中我們知道返回的是乙個表型別key_value,其資料字段有guid,name,hobby,所以我們需要建立乙個相對應的複雜型別來接收這個返回結果,步驟如下圖

在新增新的複雜型別之後,命名為querystudent_result,同時把guid、hobby、name三個欄位都設定為string型別。

在函式匯入下找到querystudent然後雙擊,如下圖

將「返回以下的內容集合」設定為剛剛新增的複雜型別querystudent_result,點選確定即可。

4.呼叫

呼叫示例**如下

dbdemoentities dbcontext = new dbdemoentities();

var data = dbcontext.querystudent(" st_name='張三' ").tolist();

string str = $"=,"

+$"=,"

+ $"=,";

結果如下圖

至此,entityframework呼叫儲存過程返回結果的接收就完成了。如果是ef6.0的,在新增模型的時候會直接生成querystudent_result的型別,無須再單獨建立。

Entity Framework 架構簡介

當微軟的wcf 大行其道,通用資料訪問模型entity framework卻稍遜一籌,有很多需要完善和進步的地方,本文對entity framework 架構做一下簡介。實體框架 entitry framework 以下簡稱ef 看起來像乙個有趣的技術,更強大,比linq to sql 更先進。這兩...

entity framework 批量刪除

以前用sql寫批量刪除的時候,感覺挺利索的,簡潔地寫了 public bool delectusersuggest string addsql 然後在頁面層直接呼叫 現在用entity framework,感覺有點麻煩不能直接delete,還要先把資料查出來,以下是主要 1 先查出實體 region...

Entity Framework 動態查詢

不想多說什麼直接說 region 搜尋並分頁 ljy 傳入搜尋條件,當前頁碼,每頁的顯示的條數,資料的總數 輸出引數 三個引數,返回 商實體 搜尋條件 當前頁碼 每頁的顯示的條數 資料的總數 public iqueryable endregion 在頁面呼叫時如果通過時間來查詢,請記住一定要這樣寫 ...