/// <summary> /// Saves the Settings /// </summary> public static void Save() { XmlWriter xmlWriter = new XmlWriter(); if (!xmlWriter.Load(SettingsFile)) { if (File.Exists(SettingsFile)) { try { File.Delete(SettingsFile); } catch (Exception) { return; } } // create it and reload xmlWriter.CreateXmlSettings(SettingsFile); xmlWriter.Load(SettingsFile); } xmlWriter.WriteSetting(cTraktUsername, TraktUsername); xmlWriter.WriteSetting(cTraktPassword, TraktPassword); xmlWriter.WriteSetting(cTraktOAuthToken, TraktOAuthToken); xmlWriter.WriteSetting(cTraktOAuth, TraktOAuth.ToString()); xmlWriter.WriteSetting(cTVDbAccountId, TVDbAccountIdentifier); xmlWriter.WriteSetting(cTMDbSessionId, TMDbSessionId); xmlWriter.WriteSetting(cTMDBSyncWatchlist, TMDbSyncWatchlist.ToString()); xmlWriter.WriteSetting(cIMDbRatingsFilename, IMDbRatingsFilename); xmlWriter.WriteSetting(cIMDbWatchlistFilename, IMDbWatchlistFilename); xmlWriter.WriteSetting(cIMDbUsername, IMDbUsername); xmlWriter.WriteSetting(cIMDBSyncWatchlist, IMDbSyncWatchlist.ToString()); xmlWriter.WriteSetting(cIMDbCustomLists, IMDbCustomLists.ToJSON()); xmlWriter.WriteSetting(cListalSyncWatchlist, ListalSyncWatchlist.ToString()); xmlWriter.WriteSetting(cListalMovieFilename, ListalMovieFilename); xmlWriter.WriteSetting(cListalShowFilename, ListalShowFilename); xmlWriter.WriteSetting(cCritickerMovieFilename, CritickerMovieFilename); xmlWriter.WriteSetting(cLetterboxdRatingsFilename, LetterboxdRatingsFilename); xmlWriter.WriteSetting(cLetterboxdWatchedFilename, LetterboxdWatchedFilename); xmlWriter.WriteSetting(cLetterboxdDiaryFilename, LetterboxdDiaryFilename); xmlWriter.WriteSetting(cFlixsterUserId, FlixsterUserId); xmlWriter.WriteSetting(cFlixsterSyncWantToSee, FlixsterSyncWantToSee.ToString()); xmlWriter.WriteSetting(cMarkAsWatched, MarkAsWatched.ToString()); xmlWriter.WriteSetting(cIgnoreWatchedForWatchlist, IgnoreWatchedForWatchlist.ToString()); xmlWriter.WriteSetting(cEnableIMDb, EnableIMDb.ToString()); xmlWriter.WriteSetting(cEnableTMDb, EnableTMDb.ToString()); xmlWriter.WriteSetting(cEnableTVDb, EnableTVDb.ToString()); xmlWriter.WriteSetting(cEnableListal, EnableListal.ToString()); xmlWriter.WriteSetting(cEnableCriticker, EnableCriticker.ToString()); xmlWriter.WriteSetting(cEnableLetterboxd, EnableLetterboxd.ToString()); xmlWriter.WriteSetting(cEnableFlixster, EnableFlixster.ToString()); xmlWriter.WriteSetting(cLogLevel, ((int)LogSeverityLevel).ToString()); xmlWriter.WriteSetting(cBatchSize, BatchSize.ToString()); xmlWriter.WriteSetting(cWatchedOnReleaseDay, WatchedOnReleaseDay.ToString()); // save file xmlWriter.Save(SettingsFile); }
public void DisplayOptions() { var lines = new List <Tuple <string, string> > { new Tuple <string, string>("Operations", Operation.ToString()), new Tuple <string, string>("Batch size", BatchSize.ToString()), new Tuple <string, string>("Client count", ClientCount.ToString()), new Tuple <string, string>("Time limit", TimeLimit?.ToString() ?? "<not set>"), }; lines.ForEach(x => Console.WriteLine($"{x.Item1,-12}: {x.Item2}")); Console.WriteLine(); }
public DbCommand CreateCommand(IQueryable query, IEntityType entity) { var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName == "EntityFramework.MicrosoftSqlServer, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"); if (assembly != null) { var type = assembly.GetType("Microsoft.Data.Entity.SqlServerMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("SqlServer", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(IEntityType) }, null); var sqlServerPropertyMethod = type.GetMethod("SqlServer", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(IProperty) }, null); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping var tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("[", sqlServer.TableName, "]") : string.Concat("[", sqlServer.Schema, "].[", sqlServer.TableName, "]"); // GET keys mappings var columnKeys = new List <string>(); foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } // GET command text template var commandTextTemplate = BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query var relationalCommand = query.CreateCommand(); var querySelect = relationalCommand.CommandText; // GET primary key join var primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]"))); // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")); // CREATE command var command = query.GetDbContext().CreateStoreCommand(); command.CommandText = commandTextTemplate; // ADD Parameter var parameterCollection = relationalCommand.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.ParameterName = parameter.Name; param.Value = parameter.Value; command.Parameters.Add(param); } return(command); } return(null); }
/// <summary>Creates a command to execute the batch operation.</summary> /// <param name="query">The query.</param> /// <param name="entity">The schema entity.</param> /// <returns>The new command to execute the batch operation.</returns> internal DbCommand CreateCommand <T>(ObjectQuery query, SchemaEntityType <T> entity) { // GET mapping var mapping = entity.Info.EntityTypeMapping.MappingFragment; var store = mapping.StoreEntitySet; var tableName = string.IsNullOrEmpty(store.Schema) ? string.Concat("[", store.Table, "]") : string.Concat("[", store.Schema, "].[", store.Table, "]"); // GET keys mappings var columnKeys = new List <string>(); foreach (var propertyKey in entity.Info.Key.PropertyRefs) { var mappingProperty = mapping.ScalarProperties.Find(x => x.Name == propertyKey.Name); if (mappingProperty == null) { throw new Exception(string.Format(ExceptionMessage.BatchOperations_PropertyNotFound, propertyKey.Name)); } columnKeys.Add(mappingProperty.ColumnName); } // GET command text template var commandTextTemplate = BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query var querySelect = query.ToTraceString(); // GET primary key join var primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]"))); // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")); // CREATE command var command = query.Context.CreateStoreCommand(); command.CommandText = commandTextTemplate; // ADD Parameter var parameterCollection = query.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.ParameterName = parameter.Name; param.Value = parameter.Value; command.Parameters.Add(param); } return(command); }
public DbCommand CreateCommand(IQueryable query, IEntityType entity) { #if NETSTANDARD1_3 try { Assembly assembly; try { assembly = Assembly.Load(new AssemblyName("Microsoft.EntityFrameworkCore.SqlServer")); } catch (Exception ex) { throw new Exception(ExceptionMessage.BatchOperations_AssemblyNotFound); } if (assembly != null) { var type = assembly.GetType("Microsoft.EntityFrameworkCore.SqlServerMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("SqlServer", new[] { typeof(IEntityType) }); var sqlServerPropertyMethod = type.GetMethod("SqlServer", new[] { typeof(IProperty) }); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping var tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("[", sqlServer.TableName, "]") : string.Concat("[", sqlServer.Schema, "].[", sqlServer.TableName, "]"); // GET keys mappings var columnKeys = new List <string>(); foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } // GET command text template var commandTextTemplate = BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query #if EFCORE RelationalQueryContext queryContext; var relationalCommand = query.CreateCommand(out queryContext); #else var relationalCommand = query.CreateCommand(); #endif var querySelect = relationalCommand.CommandText; // GET primary key join var primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]"))); // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")); // CREATE command var command = query.GetDbContext().CreateStoreCommand(); command.CommandText = commandTextTemplate; #if EFCORE // ADD Parameter foreach (var relationalParameter in relationalCommand.Parameters) { var parameter = queryContext.ParameterValues[relationalParameter.InvariantName]; var param = command.CreateParameter(); param.ParameterName = relationalParameter.InvariantName; param.Value = parameter ?? DBNull.Value; command.Parameters.Add(param); } #else // ADD Parameter var parameterCollection = relationalCommand.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.ParameterName = parameter.Name; param.Value = parameter.Value ?? DBNull.Value; command.Parameters.Add(param); } #endif return(command); } return(null); } catch (Exception) { return(null); } #else var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.StartsWith("Microsoft.EntityFrameworkCore.SqlServer", StringComparison.InvariantCulture)); if (assembly != null) { var type = assembly.GetType("Microsoft.EntityFrameworkCore.SqlServerMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("SqlServer", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(IEntityType) }, null); var sqlServerPropertyMethod = type.GetMethod("SqlServer", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(IProperty) }, null); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping var tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("[", sqlServer.TableName, "]") : string.Concat("[", sqlServer.Schema, "].[", sqlServer.TableName, "]"); // GET keys mappings var columnKeys = new List <string>(); foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } // GET command text template var commandTextTemplate = BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query #if EFCORE RelationalQueryContext queryContext; var relationalCommand = query.CreateCommand(out queryContext); #else var relationalCommand = query.CreateCommand(); #endif var querySelect = relationalCommand.CommandText; // GET primary key join var primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]"))); // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")); // CREATE command var command = query.GetDbContext().CreateStoreCommand(); command.CommandText = commandTextTemplate; #if EFCORE // ADD Parameter foreach (var relationalParameter in relationalCommand.Parameters) { var parameter = queryContext.ParameterValues[relationalParameter.InvariantName]; var param = command.CreateParameter(); param.ParameterName = relationalParameter.InvariantName; param.Value = parameter ?? DBNull.Value; command.Parameters.Add(param); } #else // ADD Parameter var parameterCollection = relationalCommand.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.ParameterName = parameter.Name; param.Value = parameter.Value ?? DBNull.Value; command.Parameters.Add(param); } #endif return(command); } return(null); #endif }
/// <summary>Creates a command to execute the batch operation.</summary> /// <exception cref="Exception">Thrown when an exception error condition occurs.</exception> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="query">The query.</param> /// <param name="entity">The schema entity.</param> /// <param name="visitor">The visitor.</param> /// <returns>The new command to execute the batch operation.</returns> internal DbCommand CreateCommand <T>(ObjectQuery query, SchemaEntityType <T> entity) { // GET command var command = query.Context.CreateStoreCommand(); bool isMySql = command.GetType().FullName.Contains("MySql"); var isSqlCe = command.GetType().Name == "SqlCeCommand"; var isOracle = command.GetType().Namespace.Contains("Oracle"); // Oracle BindByName if (isOracle) { var bindByNameProperty = command.GetType().GetProperty("BindByName") ?? command.GetType().GetProperty("PassParametersByName"); if (bindByNameProperty != null) { bindByNameProperty.SetValue(command, true, null); } } // GET mapping var mapping = entity.Info.EntityTypeMapping.MappingFragment; var store = mapping.StoreEntitySet; string tableName; if (isMySql) { tableName = string.Concat("`", store.Table, "`"); } else if (isSqlCe) { tableName = string.Concat("[", store.Table, "]"); } else if (isOracle) { tableName = string.IsNullOrEmpty(store.Schema) || store.Schema == "dbo" ? string.Concat("\"", store.Table, "\"") : string.Concat("\"", store.Schema, "\".\"", store.Table, "\""); } else { tableName = string.IsNullOrEmpty(store.Schema) ? string.Concat("[", store.Table, "]") : string.Concat("[", store.Schema, "].[", store.Table, "]"); } // GET keys mappings var columnKeys = new List <string>(); foreach (var propertyKey in entity.Info.Key.PropertyRefs) { var mappingProperty = mapping.ScalarProperties.Find(x => x.Name == propertyKey.Name); if (mappingProperty == null) { throw new Exception(string.Format(ExceptionMessage.BatchOperations_PropertyNotFound, propertyKey.Name)); } columnKeys.Add(mappingProperty.ColumnName); } // GET command text template var commandTextTemplate = command.GetType().Name == "NpgsqlCommand" ? CommandTextPostgreSQLTemplate : isOracle ? CommandTextOracleTemplate : isMySql ? CommandTextTemplate_MySql : isSqlCe ? CommandTextSqlCeTemplate : BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query var customQuery = query.GetCommandTextAndParameters(); var querySelect = customQuery.Item1; // GET primary key join string primaryKeys; if (isSqlCe || isOracle) { primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle), " = B.", EscapeName(x, isMySql, isOracle), ""))); } else { primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.", EscapeName(x, isMySql, isOracle), " = B.", EscapeName(x, isMySql, isOracle), ""))); } // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")); // CREATE command command.CommandText = commandTextTemplate; // ADD Parameter var parameterCollection = customQuery.Item2; #if EF5 foreach (ObjectParameter parameter in parameterCollection) { var param = command.CreateParameter(); param.ParameterName = parameter.Name; param.Value = parameter.Value ?? DBNull.Value; command.Parameters.Add(param); } #elif EF6 foreach (DbParameter parameter in parameterCollection) { var param = command.CreateParameter(); param.ParameterName = parameter.ParameterName; param.Value = parameter.Value ?? DBNull.Value; command.Parameters.Add(param); } #endif return(command); }
public DbCommand CreateCommand(IQueryable query, IEntityType entity) { var context = query.GetDbContext(); var databaseCreator = context.Database.GetService <IDatabaseCreator>(); var assembly = databaseCreator.GetType().GetTypeInfo().Assembly; var assemblyName = assembly.GetName().Name; MethodInfo dynamicProviderEntityType = null; MethodInfo dynamicProviderProperty = null; bool isSqlServer = false; bool isPostgreSQL = false; bool isMySql = false; bool isMySqlPomelo = false; bool isSQLite = false; if (assemblyName == "Microsoft.EntityFrameworkCore.SqlServer") { isSqlServer = true; var type = assembly.GetType("Microsoft.EntityFrameworkCore.SqlServerMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("SqlServer", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("SqlServer", new[] { typeof(IProperty) }); } else if (assemblyName == "Npgsql.EntityFrameworkCore.PostgreSQL") { isPostgreSQL = true; var type = assembly.GetType("Microsoft.EntityFrameworkCore.NpgsqlMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("Npgsql", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("Npgsql", new[] { typeof(IProperty) }); } else if (assemblyName == "MySql.Data.EntityFrameworkCore") { isMySql = true; var type = assembly.GetType("MySQL.Data.EntityFrameworkCore.MySQLMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("MySQL", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("MySQL", new[] { typeof(IProperty) }); } else if (assemblyName == "Pomelo.EntityFrameworkCore.MySql") { isMySqlPomelo = true; var type = assembly.GetType("Microsoft.EntityFrameworkCore.MySqlMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("MySql", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("MySql", new[] { typeof(IProperty) }); } else if (assemblyName == "Microsoft.EntityFrameworkCore.Sqlite") { isSQLite = true; // CHANGE all for this one? dynamicProviderEntityType = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IEntityType) }); dynamicProviderProperty = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IProperty) }); } else { throw new Exception(string.Format(ExceptionMessage.Unsupported_Provider, assemblyName)); } string tableName = ""; var columnKeys = new List <string>(); string primaryKeys = ""; if (isSqlServer) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("[", sqlServer.TableName, "]") : string.Concat("[", sqlServer.Schema, "].[", sqlServer.TableName, "]"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } // GET primary key join primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]"))); } else if (isPostgreSQL) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("\"", sqlServer.TableName, "\"") : string.Concat("\"", sqlServer.Schema, "\".\"", sqlServer.TableName, "\""); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.\"", x, "\" = B.\"", x, "\""))); } else if (isMySqlPomelo) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("`", sqlServer.TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } else if (isMySql) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("`", sqlServer.TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } else if (isSQLite) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("\"", sqlServer.TableName, "\""); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + "." + "\"" + x + "\"", " = B.\"", x, "\""))); } // GET command text template var commandTextTemplate = isPostgreSQL ? CommandTextPostgreSQLTemplate : isMySql || isMySqlPomelo ? CommandTextTemplate_MySql : isSQLite ? CommandTextSQLiteTemplate : BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query #if EFCORE RelationalQueryContext queryContext; var relationalCommand = query.CreateCommand(out queryContext); #else var relationalCommand = query.CreateCommand(); #endif var querySelect = relationalCommand.CommandText; // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")) .Replace("{Hint}", UseTableLock ? "WITH ( TABLOCK )" : ""); // CREATE command var command = query.GetDbContext().CreateStoreCommand(); command.CommandText = commandTextTemplate; #if EFCORE // ADD Parameter foreach (var relationalParameter in relationalCommand.Parameters) { var parameter = queryContext.ParameterValues[relationalParameter.InvariantName]; var param = command.CreateParameter(); param.CopyFrom(relationalParameter, parameter); command.Parameters.Add(param); } #else // ADD Parameter var parameterCollection = relationalCommand.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.CopyFrom(parameter); command.Parameters.Add(param); } #endif return(command); }
/// <summary>Creates a command to execute the batch operation.</summary> /// <exception cref="Exception">Thrown when an exception error condition occurs.</exception> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="query">The query.</param> /// <param name="tdTableDefinition">The schema entity.</param> /// <returns>The new command to execute the batch operation.</returns> public DbCommand CreateCommand(ObjectQuery query, TableDefinition tdTableDefinition) { // GET command var command = query.Context.CreateStoreCommand(); bool isPostgreSql = command.GetType().Name == "NpgsqlCommand"; bool isMySql = command.GetType().FullName.Contains("MySql"); var isSqlCe = command.GetType().Name == "SqlCeCommand"; var isOracle = command.GetType().Namespace.Contains("Oracle"); var isSQLite = command.GetType().Namespace.Contains("SQLite"); // Oracle BindByName if (isOracle) { var bindByNameProperty = command.GetType().GetProperty("BindByName") ?? command.GetType().GetProperty("PassParametersByName"); if (bindByNameProperty != null) { bindByNameProperty.SetValue(command, true, null); } } string tableName; if (isMySql) { tableName = string.Concat("`", tdTableDefinition.Table, "`"); } else if (isSqlCe) { tableName = string.Concat("[", tdTableDefinition.Table, "]"); } else if (isSQLite) { tableName = string.Concat("\"", tdTableDefinition.Table, "\""); } else if (isOracle) { tableName = string.IsNullOrEmpty(tdTableDefinition.Schema) || tdTableDefinition.Schema == "dbo" ? string.Concat("\"", tdTableDefinition.Table, "\"") : string.Concat("\"", tdTableDefinition.Schema, "\".\"", tdTableDefinition.Table, "\""); } else { tableName = string.IsNullOrEmpty(tdTableDefinition.Schema) ? string.Concat("[", tdTableDefinition.Table, "]") : string.Concat("[", tdTableDefinition.Schema, "].[", tdTableDefinition.Table, "]"); } // GET command text template var commandTextTemplate = isPostgreSql ? CommandTextPostgreSQLTemplate : isOracle ? CommandTextOracleTemplate : isMySql ? CommandTextTemplate_MySql : isSqlCe ? CommandTextSqlCeTemplate : isSQLite ? CommandTextSQLiteTemplate : BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query var customQuery = query.GetCommandTextAndParameters(); if (customQuery.Item1.EndsWith("WHERE 1 = 0", StringComparison.InvariantCultureIgnoreCase)) { return(null); } if (isPostgreSql && customQuery.Item1.EndsWith("WHERE TRUE = FALSE", StringComparison.InvariantCultureIgnoreCase)) { return(null); } var querySelect = customQuery.Item1; // GET primary key join string primaryKeys; if (isSqlCe || isOracle || isSQLite) { primaryKeys = string.Join(Environment.NewLine + "AND ", tdTableDefinition.Keys.Select(x => string.Concat(tableName + ".", EscapeName(x.ColumnName, isMySql, isOracle), " = B.", EscapeName(x.ColumnName, isMySql, isOracle), ""))); } else { primaryKeys = string.Join(Environment.NewLine + "AND ", tdTableDefinition.Keys.Select(x => string.Concat("A.", EscapeName(x.ColumnName, isMySql, isOracle), " = B.", EscapeName(x.ColumnName, isMySql, isOracle), ""))); } // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")) .Replace("{Hint}", UseTableLock ? "WITH ( TABLOCK )" : ""); // CREATE command command.CommandText = commandTextTemplate; // ADD Parameter var parameterCollection = customQuery.Item2; #if EF5 foreach (ObjectParameter parameter in parameterCollection) { var param = command.CreateParameter(); param.CopyFrom(parameter); command.Parameters.Add(param); } #elif EF6 foreach (DbParameter parameter in parameterCollection) { var param = command.CreateParameter(); param.CopyFrom(parameter); command.Parameters.Add(param); } #endif return(command); }
public DbCommand CreateCommand(IQueryable query, IEntityType entity) { var context = query.GetDbContext(); var databaseCreator = context.Database.GetService <IDatabaseCreator>(); var assembly = databaseCreator.GetType().GetTypeInfo().Assembly; var assemblyName = assembly.GetName().Name; MethodInfo dynamicProviderEntityType = null; MethodInfo dynamicProviderProperty = null; bool isSqlServer = false; bool isPostgreSQL = false; bool isMySql = false; bool isMySqlPomelo = false; bool isSQLite = false; bool isOracle = false; bool isDevOracle = false; if (assemblyName == "Microsoft.EntityFrameworkCore.SqlServer") { isSqlServer = true; var type = assembly.GetType("Microsoft.EntityFrameworkCore.SqlServerMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("SqlServer", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("SqlServer", new[] { typeof(IProperty) }); } else if (assemblyName == "Npgsql.EntityFrameworkCore.PostgreSQL") { isPostgreSQL = true; var type = assembly.GetType("Microsoft.EntityFrameworkCore.NpgsqlMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("Npgsql", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("Npgsql", new[] { typeof(IProperty) }); } else if (assemblyName == "MySql.Data.EntityFrameworkCore") { isMySql = true; var type = assembly.GetType("MySQL.Data.EntityFrameworkCore.MySQLMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("MySQL", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("MySQL", new[] { typeof(IProperty) }); } else if (assemblyName == "Pomelo.EntityFrameworkCore.MySql") { isMySqlPomelo = true; var type = assembly.GetType("Microsoft.EntityFrameworkCore.MySqlMetadataExtensions"); dynamicProviderEntityType = type.GetMethod("MySql", new[] { typeof(IEntityType) }); dynamicProviderProperty = type.GetMethod("MySql", new[] { typeof(IProperty) }); } else if (assemblyName == "Microsoft.EntityFrameworkCore.Sqlite") { isSQLite = true; // CHANGE all for this one? dynamicProviderEntityType = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IEntityType) }); dynamicProviderProperty = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IProperty) }); } else if (assemblyName == "Oracle.EntityFrameworkCore") { isOracle = true; // CHANGE all for this one? dynamicProviderEntityType = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IEntityType) }); dynamicProviderProperty = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IProperty) }); } else if (assemblyName == "Devart.Data.Oracle.Entity.EFCore") { isDevOracle = true; // CHANGE all for this one? dynamicProviderEntityType = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IEntityType) }); dynamicProviderProperty = typeof(RelationalMetadataExtensions).GetMethod("Relational", new[] { typeof(IProperty) }); } else { throw new Exception(string.Format(ExceptionMessage.Unsupported_Provider, assemblyName)); } string tableName = ""; var columnKeys = new List <string>(); string primaryKeys = ""; if (isSqlServer) { List <Tuple <string, string> > propertyAndColumnName = new List <Tuple <string, string> >(); var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("[", sqlServer.TableName, "]") : string.Concat("[", sqlServer.Schema, "].[", sqlServer.TableName, "]"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); //columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); propertyAndColumnName.Add(new Tuple <string, string>(propertyKey.Name, (string)columnNameProperty.GetValue(mappingProperty))); } // GET primary key join primaryKeys = propertyAndColumnName.Count > 1? string.Join(Environment.NewLine + "AND ", propertyAndColumnName.Select(x => string.Concat("A.[", x.Item2, "] = B.[", x.Item1, "]"))): string.Join(Environment.NewLine + "AND ", propertyAndColumnName.Select(x => string.Concat("A.[", x.Item2, "] = B.[", x.Item2, "]"))); } else if (isPostgreSQL) { List <Tuple <string, string> > propertyAndColumnName = new List <Tuple <string, string> >(); var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("\"", sqlServer.TableName, "\"") : string.Concat("\"", sqlServer.Schema, "\".\"", sqlServer.TableName, "\""); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); //columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); propertyAndColumnName.Add(new Tuple <string, string>(propertyKey.Name, (string)columnNameProperty.GetValue(mappingProperty))); } primaryKeys = string.Join(Environment.NewLine + "AND ", propertyAndColumnName.Select(x => string.Concat("A.\"", x.Item2, "\" = B.\"", x.Item1, "\""))); } else if (isMySqlPomelo) { if (dynamicProviderEntityType == null) { // GET mapping tableName = string.Concat("`", entity.Relational().TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { columnKeys.Add(propertyKey.Relational().ColumnName); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } else { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("`", sqlServer.TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } } else if (isMySql) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("`", sqlServer.TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } else if (isSQLite) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("\"", sqlServer.TableName, "\""); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + "." + "\"" + x + "\"", " = B.\"", x, "\""))); } else if (isOracle || isDevOracle) { var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("\"", sqlServer.TableName, "\"") : string.Concat("\"", sqlServer.Schema, "\".\"", sqlServer.TableName, "\""); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } // GET primary key join primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".\"", x, "\" = B.\"", x, "\""))); } // GET command text template var commandTextTemplate = isPostgreSQL ? CommandTextPostgreSQLTemplate : isMySql || isMySqlPomelo ? CommandTextTemplate_MySql : isSQLite ? CommandTextSQLiteTemplate : (isOracle || isDevOracle) ? CommandTextOracleTemplate : BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query #if EFCORE RelationalQueryContext queryContext; var relationalCommand = query.CreateCommand(out queryContext); #else var relationalCommand = query.CreateCommand(); #endif var querySelect = relationalCommand.CommandText; // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")) .Replace("{Hint}", UseTableLock ? "WITH ( TABLOCK )" : ""); // CREATE command var command = query.GetDbContext().CreateStoreCommand(); command.CommandText = commandTextTemplate; #if EFCORE // ADD Parameter foreach (var relationalParameter in relationalCommand.Parameters) { object parameter; string name = ""; #if NETSTANDARD2_0 if (isOracle || isDevOracle) { name = ((dynamic)relationalParameter).Name; } else { #endif name = relationalParameter.InvariantName; #if NETSTANDARD2_0 } #endif if (!queryContext.ParameterValues.TryGetValue(relationalParameter.InvariantName, out parameter)) { if (relationalParameter.InvariantName.StartsWith("__ef_filter")) { throw new Exception("Please use 'IgnoreQueryFilters()'. The HasQueryFilter is not yet supported."); } else { throw new Exception("The following parameter could not be found: " + relationalParameter); } } var param = command.CreateParameter(); param.CopyFrom(relationalParameter, parameter, name); #if !NETSTANDARD1_3 if (isPostgreSQL) { Type itemType = param.Value.GetType(); if (itemType.IsEnum) { var underlyingType = Enum.GetUnderlyingType(itemType); param.Value = Convert.ChangeType(param.Value, underlyingType); } } #endif command.Parameters.Add(param); } #else // ADD Parameter var parameterCollection = relationalCommand.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.CopyFrom(parameter); command.Parameters.Add(param); } #endif return(command); }
public DbCommand CreateCommand(IQueryable query, IEntityType entity) { #if NETSTANDARD1_3 Assembly assembly = null; Assembly postgreSqlAssembly = null; Assembly mySqlPomelo = null; Assembly mySql = null; try { assembly = Assembly.Load(new AssemblyName("Microsoft.EntityFrameworkCore.SqlServer")); } catch (Exception ex) { try { postgreSqlAssembly = Assembly.Load(new AssemblyName("Npgsql.EntityFrameworkCore.PostgreSQL")); } catch { try { mySql = Assembly.Load(new AssemblyName("MySql.Data.EntityFrameworkCore")); } catch { try { mySqlPomelo = Assembly.Load(new AssemblyName("Pomelo.EntityFrameworkCore.MySql")); } catch { throw new Exception(ExceptionMessage.BatchOperations_AssemblyNotFound); } } } } #else var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.StartsWith("Microsoft.EntityFrameworkCore.SqlServer", StringComparison.InvariantCulture)); var postgreSqlAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.StartsWith("Npgsql.EntityFrameworkCore.PostgreSQL", StringComparison.InvariantCulture)); var mySqlPomelo = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.StartsWith("Pomelo.EntityFrameworkCore.MySql", StringComparison.InvariantCulture)); var mySql = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.StartsWith("MySql.Data.EntityFrameworkCore", StringComparison.InvariantCulture)); #endif if (assembly != null || postgreSqlAssembly != null || mySqlPomelo != null || mySql != null) { string tableName = ""; var columnKeys = new List <string>(); string primaryKeys = ""; if (assembly != null) { var type = assembly.GetType("Microsoft.EntityFrameworkCore.SqlServerMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("SqlServer", new[] { typeof(IEntityType) }); var sqlServerPropertyMethod = type.GetMethod("SqlServer", new[] { typeof(IProperty) }); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("[", sqlServer.TableName, "]") : string.Concat("[", sqlServer.Schema, "].[", sqlServer.TableName, "]"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } // GET primary key join primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]"))); } else if (postgreSqlAssembly != null) { var type = postgreSqlAssembly.GetType("Microsoft.EntityFrameworkCore.NpgsqlMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("Npgsql", new[] { typeof(IEntityType) }); var sqlServerPropertyMethod = type.GetMethod("Npgsql", new[] { typeof(IProperty) }); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping tableName = string.IsNullOrEmpty(sqlServer.Schema) ? string.Concat("\"", sqlServer.TableName, "\"") : string.Concat("\"", sqlServer.Schema, "\".\"", sqlServer.TableName, "\""); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.\"", x, "\" = B.\"", x, "\""))); } else if (mySqlPomelo != null) { var type = mySqlPomelo.GetType("Microsoft.EntityFrameworkCore.MySqlMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("MySql", new[] { typeof(IEntityType) }); var sqlServerPropertyMethod = type.GetMethod("MySql", new[] { typeof(IProperty) }); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("`", sqlServer.TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } else if (mySql != null) { var type = mySql.GetType("MySQL.Data.EntityFrameworkCore.MySQLMetadataExtensions"); var sqlServerEntityTypeMethod = type.GetMethod("MySQL", new[] { typeof(IEntityType) }); var sqlServerPropertyMethod = type.GetMethod("MySQL", new[] { typeof(IProperty) }); var sqlServer = (IRelationalEntityTypeAnnotations)sqlServerEntityTypeMethod.Invoke(null, new[] { entity }); // GET mapping tableName = string.Concat("`", sqlServer.TableName, "`"); // GET keys mappings foreach (var propertyKey in entity.GetKeys().ToList()[0].Properties) { var mappingProperty = sqlServerPropertyMethod.Invoke(null, new[] { propertyKey }); var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance); columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty)); } primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.`", x, "` = B.`", x, "`"))); } // GET command text template var commandTextTemplate = assembly == null && postgreSqlAssembly != null ? CommandTextPostgreSQLTemplate : mySqlPomelo != null || mySql != null ? CommandTextTemplate_MySql : BatchSize > 0 ? BatchDelayInterval > 0 ? CommandTextWhileDelayTemplate : CommandTextWhileTemplate : CommandTextTemplate; // GET inner query #if EFCORE RelationalQueryContext queryContext; var relationalCommand = query.CreateCommand(out queryContext); #else var relationalCommand = query.CreateCommand(); #endif var querySelect = relationalCommand.CommandText; // REPLACE template commandTextTemplate = commandTextTemplate.Replace("{TableName}", tableName) .Replace("{Select}", querySelect) .Replace("{PrimaryKeys}", primaryKeys) .Replace("{Top}", BatchSize.ToString()) .Replace("{Delay}", TimeSpan.FromMilliseconds(BatchDelayInterval).ToString(@"hh\:mm\:ss\:fff")) .Replace("{Hint}", UseTableLock ? "WITH ( TABLOCK )" : ""); // CREATE command var command = query.GetDbContext().CreateStoreCommand(); command.CommandText = commandTextTemplate; #if EFCORE // ADD Parameter foreach (var relationalParameter in relationalCommand.Parameters) { var parameter = queryContext.ParameterValues[relationalParameter.InvariantName]; var param = command.CreateParameter(); param.CopyFrom(relationalParameter, parameter); command.Parameters.Add(param); } #else // ADD Parameter var parameterCollection = relationalCommand.Parameters; foreach (var parameter in parameterCollection) { var param = command.CreateParameter(); param.CopyFrom(parameter); command.Parameters.Add(param); } #endif return(command); } return(null); }