using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using Dapper; using System.Data.SqlClient; namespace DapperExtensions.SqlServerExt { public static class SqlServerExt { private static readonly ConcurrentDictionary dapperExtsqlsDict = new ConcurrentDictionary(); public static DapperExtSqls GetDapperExtSqls(Type t) { if (dapperExtsqlsDict.Keys.Contains(t.TypeHandle)) { return dapperExtsqlsDict[t.TypeHandle]; } else { DapperExtSqls sqls = DapperExtCommon.GetDapperExtSqls(t); string Fields = DapperExtCommon.GetFieldsStr(sqls.AllFieldList, "[", "]"); string FieldsAt = DapperExtCommon.GetFieldsAtStr(sqls.AllFieldList); string FieldsEq = DapperExtCommon.GetFieldsEqStr(sqls.AllFieldList, "[", "]"); string FieldsExtKey = DapperExtCommon.GetFieldsStr(sqls.ExceptKeyFieldList, "[", "]"); string FieldsAtExtKey = DapperExtCommon.GetFieldsAtStr(sqls.ExceptKeyFieldList); string FieldsEqExtKey = DapperExtCommon.GetFieldsEqStr(sqls.ExceptKeyFieldList, "[", "]"); sqls.AllFields = Fields; if (sqls.HasKey && sqls.IsIdentity) //有主键并且是自增 { sqls.InsertSql = string.Format("INSERT INTO [{0}]({1})VALUES({2})", sqls.TableName, FieldsExtKey, FieldsAtExtKey); sqls.InsertIdentitySql = string.Format("SET IDENTITY_INSERT [{0}] ON;INSERT INTO [{0}]({1})VALUES({2});SET IDENTITY_INSERT [{0}] OFF", sqls.TableName, Fields, FieldsAt); } else { sqls.InsertSql = string.Format("INSERT INTO [{0}]({1})VALUES({2})", sqls.TableName, Fields, FieldsAt); } if (sqls.HasKey) //含有主键 { sqls.DeleteByIdSql = string.Format("DELETE FROM [{0}] WHERE [{1}]=@id", sqls.TableName, sqls.KeyName); sqls.DeleteByIdsSql = string.Format("DELETE FROM [{0}] WHERE [{1}] IN @ids", sqls.TableName, sqls.KeyName); sqls.GetByIdSql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}]=@id", Fields, sqls.TableName, sqls.KeyName); sqls.GetByIdsSql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}] IN @ids", Fields, sqls.TableName, sqls.KeyName); sqls.UpdateByIdSql = string.Format("UPDATE [{0}] SET {1} WHERE [{2}]=@{2}", sqls.TableName, FieldsEqExtKey, sqls.KeyName); } sqls.DeleteAllSql = string.Format("DELETE FROM [{0}]", sqls.TableName); sqls.GetAllSql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK)", Fields, sqls.TableName); dapperExtsqlsDict[t.TypeHandle] = sqls; return sqls; } } /// /// 新增单条记录 /// public static dynamic Insert(this IDbConnection conn, T entity, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey && sqls.IsIdentity) { switch (sqls.KeyType) { case "Int32": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //int case "Int64": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //long case "Decimal": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //decimal case "UInt32": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //uint case "UInt64": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //ulong case "Double": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //double case "Single": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //float case "Byte": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //byte case "SByte": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //sbyte case "Int16": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //short case "UInt16": return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //ushort default: return conn.ExecuteScalar(sqls.InsertSql + ";SELECT @@IDENTITY", entity, transaction, commandTimeout); //dynamic } } else { return conn.Execute(sqls.InsertSql, entity, transaction, commandTimeout); } } /// /// 新增多条记录 /// public static int InsertBatch(this IDbConnection conn, IEnumerable entitys, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); return conn.Execute(sqls.InsertSql, entitys, transaction, commandTimeout); } /// /// 新增(插入自增键) /// public static int InsertIdentity(this IDbConnection conn, T entity, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey && sqls.IsIdentity) { return conn.Execute(sqls.InsertIdentitySql, entity, transaction, commandTimeout); } else { throw new ArgumentException("表" + sqls.TableName + "没有自增键,无法进行InsertIdentity。"); } } /// /// 新增多条记录(插入自增键) /// public static int InsertIdentityBatch(this IDbConnection conn, IEnumerable entitys, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey && sqls.IsIdentity) { return conn.Execute(sqls.InsertIdentitySql, entitys, transaction, commandTimeout); } else { throw new ArgumentException("表" + sqls.TableName + "没有自增键,无法进行InsertIdentity。"); } } /// /// 根据Id,若存在则更新,不存在就插入 /// public static dynamic InsertOrUpdate(this IDbConnection conn, T entity, string updateFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { int result = UpdateById(conn, entity, updateFields, transaction, commandTimeout); if (result == 0) return Insert(conn, entity, transaction, commandTimeout); return result; } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法进行InsertOrUpdate。"); } } /// /// 根据Id,若存在则更新,不存在就插入,连id都一起插入 /// public static dynamic InsertOrUpdateIdentity(this IDbConnection conn, T entity, string updateFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey && sqls.IsIdentity) { int result = UpdateById(conn, entity, updateFields, transaction, commandTimeout); if (result == 0) return InsertIdentity(conn, entity, transaction, commandTimeout); return result; } else { throw new ArgumentException("表" + sqls.TableName + "没有自增键,无法进行InsertOrUpdateIdentity。"); } } /// /// 根据主键返回实体Base /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// private static T GetByIdBase(this IDbConnection conn, Type t, dynamic id, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(t); if (sqls.HasKey) { DynamicParameters dpar = new DynamicParameters(); dpar.Add("@id", id); if (returnFields == null) { return conn.QueryFirstOrDefault(sqls.GetByIdSql, dpar, transaction, commandTimeout); } else { string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}]=@id", returnFields, sqls.TableName, sqls.KeyName); return conn.QueryFirstOrDefault(sql, dpar, transaction, commandTimeout); } } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法GetById。"); } } /// /// 根据主键返dynamic /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static dynamic GetByIdDynamic(this IDbConnection conn, dynamic id, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { DynamicParameters dpar = new DynamicParameters(); dpar.Add("@id", id); if (returnFields == null) { return conn.QueryFirstOrDefault(sqls.GetByIdSql, dpar, transaction, commandTimeout); } else { string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}]=@id", returnFields, sqls.TableName, sqls.KeyName); return conn.QueryFirstOrDefault(sql, dpar, transaction, commandTimeout); } } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法GetByIdDynamic。"); } } /// /// 根据主键返回实体 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static T GetById(this IDbConnection conn, dynamic id, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByIdBase(conn, typeof(T), id, returnFields, transaction, commandTimeout); } /// /// 根据主键返回任意类型实体 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static T GetById(this IDbConnection conn, dynamic id, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByIdBase(conn, typeof(Table), id, returnFields, transaction, commandTimeout); } /// /// 根据主键ids返回实体列表 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// private static IEnumerable GetByIdsBase(this IDbConnection conn, Type t, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { if (DapperExtCommon.ObjectIsEmpty(ids)) return new List(); DapperExtSqls sqls = GetDapperExtSqls(t); if (sqls.HasKey) { DynamicParameters dpar = new DynamicParameters(); dpar.Add("@ids", ids); if (returnFields == null) { return conn.Query(sqls.GetByIdsSql, dpar, transaction, true, commandTimeout); } else { string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}] IN @ids", returnFields, sqls.TableName, sqls.KeyName); return conn.Query(sql, dpar, transaction, true, commandTimeout); } } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法GetByIds。"); } } /// /// 根据主键ids返回dynamic列表 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static IEnumerable GetByIdsDynamic(this IDbConnection conn, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { if (DapperExtCommon.ObjectIsEmpty(ids)) return new List(); DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { DynamicParameters dpar = new DynamicParameters(); dpar.Add("@ids", ids); if (returnFields == null) { return conn.Query(sqls.GetByIdsSql, dpar, transaction, true, commandTimeout); } else { string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}] IN @ids", returnFields, sqls.TableName, sqls.KeyName); return conn.Query(sql, dpar, transaction, true, commandTimeout); } } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法GetByIdsDynamic。"); } } /// /// 根据主键ids返回任意类型实体列表 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static IEnumerable GetByIds(this IDbConnection conn, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByIdsBase(conn, typeof(T), ids, returnFields, transaction, commandTimeout); } /// /// 根据主键ids返回任意类型实体列表 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static IEnumerable GetByIds(this IDbConnection conn, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByIdsBase(conn, typeof(Table), ids, returnFields, transaction, commandTimeout); } /// /// 返回整张表数据 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// private static IEnumerable GetAllBase(this IDbConnection conn, Type t, string returnFields = null, string orderby = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(t); if (returnFields == null) { return conn.Query(sqls.GetAllSql + " " + orderby, null, transaction, true, commandTimeout); } else { string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) " + orderby, returnFields, sqls.TableName); return conn.Query(sql, null, transaction, true, commandTimeout); } } /// /// 返回整张表数据 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static IEnumerable GetAllDynamic(this IDbConnection conn, string returnFields = null, string orderby = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (returnFields == null) { return conn.Query(sqls.GetAllSql + " " + orderby, null, transaction, true, commandTimeout); } else { string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) " + orderby, returnFields, sqls.TableName); return conn.Query(sql, null, transaction, true, commandTimeout); } } /// /// 返回整张表数据 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static IEnumerable GetAll(this IDbConnection conn, string returnFields = null, string orderby = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetAllBase(conn, typeof(T), returnFields, orderby, transaction, commandTimeout); } /// /// 返回整张表任意类型数据 /// returnFields需要返回的列,用逗号隔开。默认null,返回所有列 /// public static IEnumerable GetAll(this IDbConnection conn, string returnFields = null, string orderby = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetAllBase(conn, typeof(Table), returnFields, orderby, transaction, commandTimeout); } /// /// 根据主键删除数据 /// public static int DeleteById(this IDbConnection conn, dynamic id, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { DynamicParameters dpar = new DynamicParameters(); dpar.Add("@id", id); return conn.Execute(sqls.DeleteByIdSql, dpar, transaction, commandTimeout); } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法DeleteById。"); } } /// /// 根据主键批量删除数据 /// public static int DeleteByIds(this IDbConnection conn, object ids, IDbTransaction transaction = null, int? commandTimeout = null) { if (DapperExtCommon.ObjectIsEmpty(ids)) return 0; DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { DynamicParameters dpar = new DynamicParameters(); dpar.Add("@ids", ids); return conn.Execute(sqls.DeleteByIdsSql, dpar, transaction, commandTimeout); } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法DeleteById。"); } } /// /// 删除整张表数据 /// public static int DeleteAll(this IDbConnection conn, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); return conn.Execute(sqls.DeleteAllSql, null, transaction, commandTimeout); } /// /// 根据条件删除 /// public static int DeleteByWhere(this IDbConnection conn, string where, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); string sql = string.Format("DELETE FROM [{0}] {1}", sqls.TableName, where); return conn.Execute(sql, param, transaction, commandTimeout); } /// /// 根据主键修改数据 /// public static int UpdateById(this IDbConnection conn, T entity, string updateFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { if (updateFields == null) { return conn.Execute(sqls.UpdateByIdSql, entity, transaction, commandTimeout); } else { string updateList = DapperExtCommon.GetFieldsEqStr(updateFields.Split(',').ToList(), "[", "]"); string sql = string.Format("UPDATE [{0}] SET {1} WHERE [{2}]=@{2}", sqls.TableName, updateList, sqls.KeyName); return conn.Execute(sql, entity, transaction, commandTimeout); } } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法UpdateById。"); } } /// /// 根据主键修改数据(批量修改) /// public static int UpdateByIdBatch(this IDbConnection conn, IEnumerable entitys, string updateFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (sqls.HasKey) { if (updateFields == null) { return conn.Execute(sqls.UpdateByIdSql, entitys, transaction, commandTimeout); } else { string updateList = DapperExtCommon.GetFieldsEqStr(updateFields.Split(',').ToList(), "[", "]"); string sql = string.Format("UPDATE [{0}] SET {1} WHERE [{2}]=@{2}", sqls.TableName, updateList, sqls.KeyName); return conn.Execute(sql, entitys, transaction, commandTimeout); } } else { throw new ArgumentException("表" + sqls.TableName + "没有主键,无法UpdateById。"); } } /// /// 根据条件修改数据 /// public static int UpdateByWhere(this IDbConnection conn, string where, string updateFields, object entity, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); updateFields = DapperExtCommon.GetFieldsEqStr(updateFields.Split(',').ToList(), "[", "]"); string sql = string.Format("UPDATE [{0}] SET {1} {2}", sqls.TableName, updateFields, where); return conn.Execute(sql, entity, transaction, commandTimeout); } /// /// 获取总数 /// /// public static int GetTotal(this IDbConnection conn, string where = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); string sql = string.Format("SELECT COUNT(1) FROM [{0}] WITH(NOLOCK) {1}", sqls.TableName, where); return conn.ExecuteScalar(sql, param, transaction, commandTimeout); } /// /// Base获取数据,使用skip 和take /// /// private static IEnumerable GetBySkipBase(this IDbConnection conn, Type t, int skip, int take, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(t); if (returnFields == null) returnFields = sqls.AllFields; if (orderBy == null) { if (sqls.HasKey) { orderBy = string.Format("ORDER BY [{0}] DESC", sqls.KeyName); } else { orderBy = string.Format("ORDER BY [{0}]", sqls.AllFieldList.First()); } } StringBuilder sb = new StringBuilder(); if (skip == 0) //第一页,使用Top语句 { sb.AppendFormat("SELECT TOP ({0}) {1} FROM [{2}] WITH(NOLOCK) {3} {4}", take, returnFields, sqls.TableName, where, orderBy); } else //使用ROW_NUMBER() { sb.AppendFormat("WITH cte AS(SELECT ROW_NUMBER() OVER({0}) AS rownum,{1} FROM [{2}] WITH(NOLOCK) {3})", orderBy, returnFields, sqls.TableName, where); if (returnFields.Contains(" AS") || returnFields.Contains(" as")) { sb.AppendFormat("SELECT * FROM cte WHERE cte.rownum BETWEEN {1} AND {2}", returnFields, skip + 1, skip + take); } else { sb.AppendFormat("SELECT {0} FROM cte WHERE cte.rownum BETWEEN {1} AND {2}", returnFields, skip + 1, skip + take); } } return conn.Query(sb.ToString(), param, transaction, true, commandTimeout); } /// /// 获取dynamic数据,使用skip 和take /// /// public static IEnumerable GetBySkipDynamic(this IDbConnection conn, int skip, int take, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (returnFields == null) returnFields = sqls.AllFields; if (orderBy == null) { if (sqls.HasKey) { orderBy = string.Format("ORDER BY [{0}] DESC", sqls.KeyName); } else { orderBy = string.Format("ORDER BY [{0}]", sqls.AllFieldList.First()); } } StringBuilder sb = new StringBuilder(); if (skip == 0) //第一页,使用Top语句 { sb.AppendFormat("SELECT TOP ({0}) {1} FROM [{2}] WITH(NOLOCK) {3} {4}", take, returnFields, sqls.TableName, where, orderBy); } else //使用ROW_NUMBER() { sb.AppendFormat("WITH cte AS(SELECT ROW_NUMBER() OVER({0}) AS rownum,{1} FROM [{2}] WITH(NOLOCK) {3})", orderBy, returnFields, sqls.TableName, where); if (returnFields.Contains(" AS") || returnFields.Contains(" as")) { sb.AppendFormat("SELECT * FROM cte WHERE cte.rownum BETWEEN {1} AND {2}", returnFields, skip + 1, skip + take); } else { sb.AppendFormat("SELECT {0} FROM cte WHERE cte.rownum BETWEEN {1} AND {2}", returnFields, skip + 1, skip + take); } } return conn.Query(sb.ToString(), param, transaction, true, commandTimeout); } /// /// 获取dynamic分页数据 /// public static IEnumerable GetByPageIndexDynamic(this IDbConnection conn, int pageIndex, int pageSize, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { int skip = 0; if (pageIndex > 0) { skip = (pageIndex - 1) * pageSize; } return GetBySkipDynamic(conn, skip, pageSize, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 获取数据,使用skip 和take /// /// public static IEnumerable GetBySkip(this IDbConnection conn, int skip, int take, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetBySkipBase(conn, typeof(T), skip, take, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 获取数据,使用skip 和take,返回任意类型数据 /// /// public static IEnumerable GetBySkip(this IDbConnection conn, int skip, int take, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetBySkipBase(conn, typeof(Table), skip, take, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 获取分页数据 /// public static IEnumerable GetByPageIndex(this IDbConnection conn, int pageIndex, int pageSize, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { int skip = 0; if (pageIndex > 0) { skip = (pageIndex - 1) * pageSize; } return GetBySkip(conn, skip, pageSize, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 获取分页数据,返回任意类型数据 /// public static IEnumerable GetByPageIndex(this IDbConnection conn, int pageIndex, int pageSize, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { int skip = 0; if (pageIndex > 0) { skip = (pageIndex - 1) * pageSize; } return GetBySkip(conn, skip, pageSize, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 根据查询条件获取数据 /// private static IEnumerable GetByWhereBase(this IDbConnection conn, Type t, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(t); if (returnFields == null) returnFields = sqls.AllFields; string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) {2} {3}", returnFields, sqls.TableName, where, orderBy); return conn.Query(sql, param, transaction, true, commandTimeout); } /// /// 根据查询条件获取Dynamic数据 /// public static IEnumerable GetByWhereDynamic(this IDbConnection conn, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (returnFields == null) returnFields = sqls.AllFields; string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) {2} {3}", returnFields, sqls.TableName, where, orderBy); return conn.Query(sql, param, transaction, true, commandTimeout); } /// /// 根据查询条件获取数据 /// public static IEnumerable GetByWhere(this IDbConnection conn, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByWhereBase(conn, typeof(T), where, param, returnFields, orderBy, transaction, commandTimeout); } /// /// 根据查询条件获取数据 /// public static IEnumerable GetByWhere(this IDbConnection conn, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByWhereBase(conn, typeof(Table), where, param, returnFields, orderBy, transaction, commandTimeout); } /// /// 返回DataTable /// public static DataTable GetDataTable(this IDbConnection conn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { return DapperExtAllSQL.GetDataTableBase(conn, sql, param, transaction, commandTimeout); } /// /// 返回DataSet /// public static DataSet GetDataSet(this IDbConnection conn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { return DapperExtAllSQL.GetDataSetBase(conn, sql, param, transaction, commandTimeout); } /// /// 获取表结构,返回DataTable /// public static DataTable GetSchemaTable(this IDbConnection conn, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (returnFields == null) { returnFields = sqls.AllFields; } string sql = string.Format("SELECT TOP (0) {0} FROM [{1}] WITH(NOLOCK)", returnFields, sqls.TableName); return GetDataTable(conn, sql, null, transaction, commandTimeout); } /// /// 大批量插入数据 /// 默认自增主键 /// insert_identity为true时允许插入自增主键 /// public static void BulkCopy(this IDbConnection conn, DataTable dt, IDbTransaction transaction, string fields = null, bool insert_identity = false, int batchSize = 5000, int commandTimeout = 500000) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); SqlBulkCopyOptions option = SqlBulkCopyOptions.Default; //Default不插入主键 if (insert_identity == true) { option = SqlBulkCopyOptions.KeepIdentity; } using (SqlBulkCopy bulkCopy = new SqlBulkCopy((SqlConnection)conn, option, (SqlTransaction)transaction)) { bulkCopy.BatchSize = batchSize; bulkCopy.BulkCopyTimeout = commandTimeout; bulkCopy.DestinationTableName = sqls.TableName; if (fields != null) { foreach (var item in fields.Split(',')) { bulkCopy.ColumnMappings.Add(item, item); } } else { foreach (DataColumn col in dt.Columns) { bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); } } bulkCopy.WriteToServer(dt); } } /// /// 根据主键大批量更新数据 /// 要求表有主键,根据主键更新数据 /// updateFields修改个别字段一定要加上主键字段 /// public static void BulkUpdate(this IDbConnection conn, DataTable dt, IDbTransaction transaction, string updateFields = null, int batchSize = 5000, int commandTimeout = 500000) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); using (SqlCommand comm = (SqlCommand)conn.CreateCommand()) { comm.CommandTimeout = commandTimeout; comm.CommandType = CommandType.Text; using (SqlDataAdapter adapter = new SqlDataAdapter(comm)) { using (SqlCommandBuilder commandBulider = new SqlCommandBuilder(adapter)) { commandBulider.ConflictOption = ConflictOption.OverwriteChanges; //根据主键更新 adapter.UpdateBatchSize = batchSize; adapter.SelectCommand.Transaction = (SqlTransaction)transaction; if (updateFields == null) { updateFields = sqls.AllFields; } adapter.SelectCommand.CommandText = string.Format("SELECT TOP (0) {0} FROM [{1}]", updateFields, sqls.TableName); adapter.Update(dt.GetChanges()); } } } } /// /// 获取分页数据 /// private static IEnumerable GetByPageBase(this IDbConnection conn, Type t, int pageIndex, int pageSize, out int total, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(t); if (returnFields == null) returnFields = sqls.AllFields; if (orderBy == null) { if (sqls.HasKey) { orderBy = string.Format("ORDER BY [{0}] DESC", sqls.KeyName); } else { orderBy = string.Format("ORDER BY [{0}]", sqls.AllFieldList.First()); } } int skip = 0; if (pageIndex > 0) { skip = (pageIndex - 1) * pageSize; } StringBuilder sb = new StringBuilder(); sb.AppendFormat("DECLARE @total INT;SELECT @total = COUNT(1) FROM [{0}] WITH(NOLOCK) {1};SELECT @total;", sqls.TableName, where); sb.Append("IF(@total>0) BEGIN "); if (pageIndex == 1) { sb.AppendFormat("SELECT TOP ({0}) {1} FROM [{2}] WITH(NOLOCK) {3} {4}", pageSize, returnFields, sqls.TableName, where, orderBy); } else { sb.AppendFormat("WITH cte AS (SELECT ROW_NUMBER() OVER({0}) AS rownum,{1} FROM [{2}] WITH(NOLOCK) {3})", orderBy, returnFields, sqls.TableName, where); if (returnFields.Contains(" AS") || returnFields.Contains(" as")) { sb.AppendFormat("SELECT * FROM cte WHERE cte.rownum BETWEEN {0} AND {1}", skip + 1, skip + pageSize); } else { sb.AppendFormat("SELECT {0} FROM cte WHERE cte.rownum BETWEEN {1} AND {2}", returnFields, skip + 1, skip + pageSize); } } sb.Append(" END"); using (var reader = conn.QueryMultiple(sb.ToString(), param, transaction, commandTimeout)) { total = reader.ReadFirst(); if (total > 0) { return reader.Read(); } else { return new List(); } } } /// /// 获取分页数据 /// public static IEnumerable GetByPageDynamic(this IDbConnection conn, int pageIndex, int pageSize, out int total, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (returnFields == null) returnFields = sqls.AllFields; if (orderBy == null) { if (sqls.HasKey) { orderBy = string.Format("ORDER BY [{0}] DESC", sqls.KeyName); } else { orderBy = string.Format("ORDER BY [{0}]", sqls.AllFieldList.First()); } } int skip = 0; if (pageIndex > 0) { skip = (pageIndex - 1) * pageSize; } StringBuilder sb = new StringBuilder(); sb.AppendFormat("DECLARE @total INT;SELECT @total = COUNT(1) FROM [{0}] WITH(NOLOCK) {1};SELECT @total;", sqls.TableName, where); sb.Append("IF(@total>0) BEGIN "); if (pageIndex == 1) { sb.AppendFormat("SELECT TOP ({0}) {1} FROM [{2}] WITH(NOLOCK) {3} {4}", pageSize, returnFields, sqls.TableName, where, orderBy); } else { sb.AppendFormat("WITH cte AS (SELECT ROW_NUMBER() OVER({0}) AS rownum,{1} FROM [{2}] WITH(NOLOCK) {3})", orderBy, returnFields, sqls.TableName, where); if (returnFields.Contains(" AS") || returnFields.Contains(" as")) { sb.AppendFormat("SELECT * FROM cte WHERE cte.rownum BETWEEN {0} AND {1}", skip + 1, skip + pageSize); } else { sb.AppendFormat("SELECT {0} FROM cte WHERE cte.rownum BETWEEN {1} AND {2}", returnFields, skip + 1, skip + pageSize); } } sb.Append(" END"); using (var reader = conn.QueryMultiple(sb.ToString(), param, transaction, commandTimeout)) { total = reader.ReadFirst(); if (total > 0) { return reader.Read(); } else { return new List(); } } } /// /// 获取分页数据 /// public static IEnumerable GetByPage(this IDbConnection conn, int pageIndex, int pageSize, out int total, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByPageBase(conn, typeof(T), pageIndex, pageSize, out total, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 获取分页数据 /// public static IEnumerable GetByPage(this IDbConnection conn, int pageIndex, int pageSize, out int total, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByPageBase(conn, typeof(Table), pageIndex, pageSize, out total, returnFields, where, param, orderBy, transaction, commandTimeout); } /// /// 根据查询条件获取数据 /// private static T GetByWhereFirstBase(this IDbConnection conn, Type t, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(t); if (returnFields == null) returnFields = sqls.AllFields; string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) {2} {3}", returnFields, sqls.TableName, where, orderBy); return conn.QueryFirstOrDefault(sql, param, transaction, commandTimeout); } /// /// 根据查询条件获取Dynamic数据 /// public static dynamic GetByWhereFirstDynamic(this IDbConnection conn, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); if (returnFields == null) returnFields = sqls.AllFields; string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) {2} {3}", returnFields, sqls.TableName, where, orderBy); return conn.QueryFirstOrDefault(sql, param, transaction, commandTimeout); } /// /// 根据查询条件获取数据 /// public static T GetByWhereFirst(this IDbConnection conn, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByWhereFirstBase(conn, typeof(T), where, param, returnFields, orderBy, transaction, commandTimeout); } /// /// 根据查询条件获取数据 /// public static T GetByWhereFirst(this IDbConnection conn, string where = null, object param = null, string returnFields = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByWhereFirstBase(conn, typeof(Table), where, param, returnFields, orderBy, transaction, commandTimeout); } private static IEnumerable GetByInBase(this IDbConnection conn, Type t, string field, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { if (DapperExtCommon.ObjectIsEmpty(ids)) return new List(); DapperExtSqls sqls = GetDapperExtSqls(t); DynamicParameters dpar = new DynamicParameters(); dpar.Add("@ids", ids); if (returnFields == null) returnFields = sqls.AllFields; string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}] IN @ids", returnFields, sqls.TableName, field); return conn.Query(sql, dpar, transaction, true, commandTimeout); } public static IEnumerable GetByInDynamic(this IDbConnection conn, string field, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { if (DapperExtCommon.ObjectIsEmpty(ids)) return new List(); DapperExtSqls sqls = GetDapperExtSqls(typeof(T)); DynamicParameters dpar = new DynamicParameters(); dpar.Add("@ids", ids); if (returnFields == null) returnFields = sqls.AllFields; string sql = string.Format("SELECT {0} FROM [{1}] WITH(NOLOCK) WHERE [{2}] IN @ids", returnFields, sqls.TableName, field); return conn.Query(sql, dpar, transaction, true, commandTimeout); } public static IEnumerable GetByIn(this IDbConnection conn, string field, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByInBase(conn, typeof(T), field, ids, returnFields, transaction, commandTimeout); } public static IEnumerable GetByIn(this IDbConnection conn, string field, object ids, string returnFields = null, IDbTransaction transaction = null, int? commandTimeout = null) { return GetByInBase(conn, typeof(Table), field, ids, returnFields, transaction, commandTimeout); } /// /// 获取分页数据 联合查询 /// public static IEnumerable GetByPageUnite(this IDbConnection conn, string prefix, int pageIndex, int pageSize, out int total, string returnFields = null, string where = null, object param = null, string orderBy = null, IDbTransaction transaction = null, int? commandTimeout = null) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("SELECT COUNT(1) FROM {0};", where); sb.AppendFormat("select top {3} * from(select row_number() over(order by {4}CreateTime desc) as rownumber,{0} from {1}) temp_table where rownumber > (({2}-1)*{3})", returnFields, where, pageIndex, pageSize, prefix); using (var reader = conn.QueryMultiple(sb.ToString(), param, transaction, commandTimeout)) { total = reader.ReadFirst(); return reader.Read(); } } } }