EF Core(扩展类)执行复杂Sql

    长情猫 36 3
    /// <summary>
        /// ef 扩展
        /// </summary>
        public static class ExtendDbRepository
        {
            /// <summary>
            /// 异步返回存储过程查询结果集(select)
            /// </summary>
            /// <param name="db"></param>
            /// <param name="sql"></param>
            /// <param name="sqlParams"></param>
            /// <returns></returns>
            public async static Task<ArrayList> ExecSpAsync(this DbContext db, string sql, SqlParameter[] sqlParams)
            {
    
                var connection = db.Database.GetDbConnection();
                using (var cmd = connection.CreateCommand())
                {
                    await db.Database.OpenConnectionAsync();
                    cmd.CommandText = sql;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.AddRange(sqlParams);
                    var dr = await cmd.ExecuteReaderAsync();
                    var columnSchema = dr.GetColumnSchema();
                    var data = new ArrayList();
                    while (await dr.ReadAsync())
                    {
                        var item = new Dictionary<string, object>();
                        foreach (var kv in columnSchema)
                        {
                            if (kv.ColumnOrdinal.HasValue)
                            {
                                var itemVal = dr.GetValue(kv.ColumnOrdinal.Value);
                                item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal : "");
                            }
                        }
                        data.Add(item);
                    }
                    dr.Dispose();
                    return data;
                }
            }
    
            /// <summary>
            /// ArrayList 转 List<T>
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="data"></param>
            /// <param name="mo"></param>
            /// <returns></returns>
            public static List<T> ConvertToList<T>(ArrayList data)
            {
                try
                {
                    List<T> res = new List<T>();
                    for (int i = 0; i < data.Count; i++)
                    {
                        var obj = JsonConvert.SerializeObject(data[i]);
                        res.Add(JsonConvert.DeserializeObject<T>(obj));
                    }
                    return res;
                }
                catch (Exception c)
                {
                    return null;
                }
            }
    
            #region 执行sql
            private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection connection, params object[] parameters)
            {
                var conn = facade.GetDbConnection();
                connection = conn;
                if (conn.State == ConnectionState.Open)
                { }
                else
                    conn.Open();
                var cmd = conn.CreateCommand();
                if (facade.IsSqlServer())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                }
                return cmd;
            }
    
            public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters)
            {
                var command = CreateCommand(facade, sql, out DbConnection conn, parameters);
                var reader = command.ExecuteReader();
                var dt = new DataTable();
                dt.Load(reader);
                reader.Close();
                conn.Close();
                return dt;
            }
    
            /// <summary>
            /// 执行sql
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="facade"></param>
            /// <param name="sql"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public static List<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new()
            {
                var dt = SqlQuery(facade, sql, parameters);
                return dt.ToList<T>();
            }
    
            public static List<T> ToList<T>(this DataTable dt) where T : class, new()
            {
                var propertyInfos = typeof(T).GetProperties();
                var list = new List<T>();
                foreach (DataRow row in dt.Rows)
                {
                    var t = new T();
                    foreach (PropertyInfo p in propertyInfos)
                    {
                        if (dt.Columns.IndexOf(p.Name) != -1 && row[p.Name] != DBNull.Value)
                            p.SetValue(t, row[p.Name], null);
                    }
                    list.Add(t);
                }
                return list;
            }
    
            #endregion
    
        }

    本文所用到的方法搜集于网上再加上自己的一些改动(主要实现了EF执行存储过程,执行复杂SQL等) 调用如下

    赞一个呗 2

    该篇文章所属“长情猫”原创所有,转载请注明本文链接

    已有 0 条评论