最近在項目中使用了Entity Framework 4.1,語句查詢全部都是用Linq和Lambda表達式完成,但是有幾個頁面查詢比較復雜,用到了多個條件匯總和列值的判斷,如果用Linq來寫語句相當復雜,還未必能實現想要的結果,最終只能選擇Oracle的存儲過程來完成,因為需要傳入參數執行查詢返回結果集。
在使用EF調用執行存儲過程獲取游標集合,試驗琢磨了幾天也未能實現,最終只能采取.Net的客戶端驅動或者OleDb連接Oracle實現存儲過程的調用,最終獲取到的集合也只能是DataSet或者DataTable,還必須要轉換成實體對象List<>。
存儲過程執行方法:

1 /// <summary> 2 /// 執行存儲過程 3 /// </summary> 4 /// <param name="storedProcName">存儲過程名</param> 5 /// <param name="parameters">存儲過程參數</param> 6 /// <param name="tableName">DataSet結果中的表名</param> 7 /// <returns>DataSet</returns> 8 public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName) 9 { 10 using (OracleConnection connection = new OracleConnection(connectionString)) 11 { 12 DataSet dataSet = new DataSet(); 13 connection.Open(); 14 OracleDataAdapter sqlDA = new OracleDataAdapter(); 15 sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); 16 sqlDA.Fill(dataSet, tableName); 17 connection.Close(); 18 return dataSet; 19 } 20 }
DataTable轉換List方法:

1 class ConvertHelper<T> where T : new() 2 { 3 /// <summary> 4 /// 利用反射和泛型 5 /// </summary> 6 /// <param name="dt"></param> 7 /// <returns></returns> 8 public static List<T> ConvertToList(DataTable dt) 9 { 10 11 // 定義集合 12 List<T> ts = new List<T>(); 13 14 // 獲得此模型的類型 15 Type type = typeof(T); 16 //定義一個臨時變量 17 string tempName = string.Empty; 18 //遍歷DataTable中所有的數據行 19 foreach (DataRow dr in dt.Rows) 20 { 21 T t = new T(); 22 // 獲得此模型的公共屬性 23 PropertyInfo[] propertys = t.GetType().GetProperties(); 24 //遍歷該對象的所有屬性 25 foreach (PropertyInfo pi in propertys) 26 { 27 tempName = pi.Name;//將屬性名稱賦值給臨時變量 28 //檢查DataTable是否包含此列(列名==對象的屬性名) 29 if (dt.Columns.Contains(tempName)) 30 { 31 // 判斷此屬性是否有Setter 32 if (!pi.CanWrite) continue;//該屬性不可寫,直接跳出 33 //取值 34 object value = dr[tempName]; 35 //如果非空,則賦給對象的屬性 36 if (value != DBNull.Value) 37 pi.SetValue(t, value, null); 38 } 39 } 40 //對象添加到泛型集合中 41 ts.Add(t); 42 } 43 44 return ts; 45 46 } 47 }
調用存儲過程:

1 public List<V_TEST> selSum(string startDate,string endDate) 2 { 3 OracleParameter[] parms = { 4 new OracleParameter("P_YBQJ_S",OracleType.VarChar,6), 5 new OracleParameter("P_YBQJ_E",OracleType.VarChar,6), 6 new OracleParameter("RESULT_CUR",OracleType.Cursor) 7 }; 8 parms[0].Value = startDate; 9 parms[1].Value = endDate; 10 parms[2].Direction = ParameterDirection.Output; 11 DataSet DS = OraHelper.RunProcedure("PRO_LJHZ", parms, "DS"); 12 List<V_TEST> list1 = ConvertHelper<V_TEST>.ConvertToList(DS.Tables[0]); 13 return list1; 14 }
有沒有高手知道EF調用存儲過程的方法,在此指導一下!
歡迎各路高手在此留下腳印,共同探討與分享~~~