• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
亮将
博客园    首页    新随笔    联系   管理    订阅  订阅
EF获取DataTable的扩展方法GetDataSet

 

微软的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;
}

 

本博客所有内容均对所有人无条件共享,欢迎学习或转载,同时也希望您也加入我们一起推动知识界的共享。 www.mccn.pub
posted on 2019-08-20 16:36  亮将  阅读(2205)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3