public static int InsertFromQuery <T>(this IQueryable <T> querable, string tableName, Expression <Func <T, object> > insertObjectExpression, BulkInsertOptions <T> options) { int rowAffected = 0; var dbQuery = querable as DbQuery <T>; var dbConnection = GetSqlConnectionFromIQuerable(querable); //Open datbase connection if (dbConnection.State == ConnectionState.Closed) { dbConnection.Open(); } using (var dbTransaction = dbConnection.BeginTransaction()) { try { var sqlQuery = SqlQuery.Parse(dbQuery.Sql); if (SqlUtil.TableExists(tableName, dbConnection, dbTransaction)) { sqlQuery.ChangeToInsert(tableName, insertObjectExpression); if (options.KeepIdentity) { SqlUtil.ToggleIdentityInsert(true, tableName, dbConnection, dbTransaction); } rowAffected = SqlUtil.ExecuteSql(sqlQuery.Sql, dbConnection, dbTransaction, options); if (options.KeepIdentity) { SqlUtil.ToggleIdentityInsert(false, tableName, dbConnection, dbTransaction); } } else { sqlQuery.Clauses.First().InputText += string.Format(" INTO {0}", tableName); rowAffected = SqlUtil.ExecuteSql(sqlQuery.Sql, dbConnection, dbTransaction, options); } dbTransaction.Commit(); } catch (Exception ex) { dbTransaction.Rollback(); throw ex; } finally { dbConnection.Close(); } } return(rowAffected); }
public static bool TableExists(this Database database, string tableName) { var dbConnection = database.Connection as SqlConnection; return(SqlUtil.TableExists(tableName, dbConnection, null)); }