使用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]3.ef端@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
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 在頁面呼叫時如果通過時間來查詢,請記住一定要這樣寫 ...