执行存储过程返回游标集合转换成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调用存储过程的方法,在此指导一下!

欢迎各路高手在此留下脚印,共同探讨与分享~~~

原文地址:https://www.cnblogs.com/ZHF/p/2599325.html