目前,EF對存儲過程的支持並不完善。存在如下問題:
EF不支持存儲過程返回多表聯合查詢的結果集。
EF僅支持返回返回某個表的所有字段,以便轉換成對應的實體。沒法支持返回部分字段的狀況。
雖然能夠正常導入返回標量值的存儲過程,可是卻沒有爲咱們自動生成相應的實體.cs代碼,咱們仍是沒法在代碼中直接調用或使用標量存儲過程
EF不能直接支持存儲過程當中Output類型的參數。
其餘一些問題。
今天咱們利用EF執行sql語句的方式來執行存儲過程,並獲得OutPut的值。sql
首先新建存儲過程:測試
Create PROCEDURE proc_testEF ( @id int, @voteCount int OUTPUT --返回值 ) AS BEGIN SELECT @voteCount = COUNT(*) FROM ConfirmItem WHERE ConfirmItemID = @id; select * from ConfirmItem where ConfirmItemID=@id; END
而後寫EF調用方法:spa
using (DBEntities context = new DBEntities()) { var idParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@id", Value = 1 }; var votesParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@voteCount", Value = 0, Direction = ParameterDirection.Output }; var results = context.Database.SqlQuery<Models.ConfirmItem>( "proc_testEF @id, @voteCount out", idParam, votesParam); var person = results.Single(); var votes = (int)votesParam.Value; //獲得OutPut類型值 return votes; }
測試屢次,沒有什麼問題;最後我對方法進行封裝:blog
/// <summary> /// 執行原始SQL命令 /// </summary> /// <param name="commandText">SQL命令</param> /// <param name="parameters">參數</param> /// <returns>影響的記錄數</returns> public Object[] ExecuteSqlNonQuery<T>(string commandText, params Object[] parameters) { using (DBEntities context = new DBEntities()) { var results = context.Database.SqlQuery<T>(commandText, parameters); results.Single(); return parameters; } }
調用方式:string
var idParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@id", Value = 1 }; var votesParam = new System.Data.SqlClient.SqlParameter { ParameterName = "@voteCount", Value = 0, Direction = ParameterDirection.Output }; System.Data.SqlClient.SqlParameter[] parm = { idParam, votesParam }; parm = (System.Data.SqlClient.SqlParameter[])new BLL.Usual.ConfirmItemManager().ExecuteSqlNonQuery<Models.ConfirmItem>("proc_testEF @id, @voteCount out", parm); string s = parm[1].Value.ToString();
固然還有其它的方式,只是以爲這種簡單方便,比起添加實體模型來講,要方便不少!it