最近在项目中使用了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调用存储过程的方法,在此指导一下!
欢迎各路高手在此留下脚印,共同探讨与分享~~~