微軟的EF至今已到了EF6版本了,但是,不知道微軟咋想的,至今也不支持直接從數據庫獲取一張數據表DataTable,但這個DataTable在許多情況下還是比確定的實體化類更方便好使,這里,我仿照微軟的書寫習慣,擴展了一個這樣的方法,同時,由於EF內部的原因,每一個聲明出的System.Data.Common.DbParameter型對象都無法重復使用,為了方便,同時為System.Data.SqlClient.SqlParameter[]型的對象擴展了一個克隆的方法,不多說了,直接上代碼吧
public static class Extension { /// <summary> /// 獲取DataSet的方法 /// </summary> /// <param name="db"></param> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="objs"></param> /// <returns></returns> public static DataSet GetDataSet(this System.Data.Entity.Database db, System.Data.CommandType commandType, string commandText, params System.Data.Common.DbParameter[] parameterValues) { System.Data.Common.DbConnection con = db.Connection;//DbConnection是SqlConnection的父類(抽象型類),其余ADO對象與此情況類同 using (System.Data.Common.DbCommand cmd = con.CreateCommand())//DbCommand是個抽象類,C#為了讓接口能正常運行,就設置了這樣一個方法來生成接口對象,也算是無奈情況下的一個特例吧,畢竟不能new,卻還必須得用 { cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.Parameters.AddRange(parameterValues); DataSet ds = new DataSet(); using (var sda = System.Data.Common.DbProviderFactories.GetFactory(con).CreateDataAdapter()) { sda.SelectCommand = cmd; sda.Fill(ds); } return ds; } } /// <summary> /// 克隆出一個新的參數數組,新被克隆者僅僅是參數名和參數值相同而又,其本質是一個新的對象,這是因為為EF擴展的GetDataSet()中的參數無法重復使用才又擴展出這樣一個方法來方便使用 /// </summary> /// <param name="paras"></param> public static List<System.Data.SqlClient.SqlParameter> Clone(this List<System.Data.SqlClient.SqlParameter> paras) { var pms = new List<System.Data.SqlClient.SqlParameter>(); foreach (var x in paras) { pms.Add(new System.Data.SqlClient.SqlParameter(x.ParameterName, x.Value)); } return pms; } }
用法如下:
using (Models.db_zhikong db = new Models.db_zhikong()) { var sql = "select * from ft_user where username=@username and staff_name like @staff_name"; var ds = db.Database.GetDataSet(CommandType.Text, sql, new System.Data.Common.DbParameter[] { new System.Data.SqlClient.SqlParameter("@username","houfb"), //注:System.Data.Common.DbParameter是System.Data.SqlClient.SqlParameter的抽象父類 new System.Data.SqlClient.SqlParameter("@staff_name","%飛彪%"), }); var row_count = ds.Tables[0].Rows.Count; }