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;
}

 


免責聲明!

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



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