執行存儲過程返回游標集合轉換成List


  最近在項目中使用了Entity Framework 4.1,語句查詢全部都是用Linq和Lambda表達式完成,但是有幾個頁面查詢比較復雜,用到了多個條件匯總和列值的判斷,如果用Linq來寫語句相當復雜,還未必能實現想要的結果,最終只能選擇Oracle的存儲過程來完成,因為需要傳入參數執行查詢返回結果集。

  在使用EF調用執行存儲過程獲取游標集合,試驗琢磨了幾天也未能實現,最終只能采取.Net的客戶端驅動或者OleDb連接Oracle實現存儲過程的調用,最終獲取到的集合也只能是DataSet或者DataTable,還必須要轉換成實體對象List<>。

  存儲過程執行方法:

View Code
 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方法:

View Code
 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     }  

  調用存儲過程:

View Code
 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調用存儲過程的方法,在此指導一下!

歡迎各路高手在此留下腳印,共同探討與分享~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM