private void RegisterDiscoveredResources(IEnumerable <Type> types, IEnumerable <LocalizationResource> allResources) { var helper = new TypeDiscoveryHelper(); var properties = types.SelectMany(type => helper.ScanResources(type)).DistinctBy(r => r.Key); // split work queue by 400 resources each var groupedProperties = properties.SplitByCount(400); Parallel.ForEach(groupedProperties, group => { var sb = new StringBuilder(); sb.AppendLine("declare @resourceId int"); var refactoredResources = group.Where(r => !string.IsNullOrEmpty(r.OldResourceKey)); foreach (var refactoredResource in refactoredResources) { sb.Append($@" if exists(select 1 from localizationresources with(nolock) where resourcekey = '{refactoredResource.OldResourceKey}') begin update dbo.localizationresources set resourcekey = '{refactoredResource.Key}', fromcode = 1 where resourcekey = '{refactoredResource.OldResourceKey}' end "); } foreach (var property in group) { var existingResource = allResources.FirstOrDefault(r => r.ResourceKey == property.Key); if (existingResource == null) { sb.Append($@" set @resourceId = isnull((select id from localizationresources where [resourcekey] = '{property.Key}'), -1) if (@resourceId = -1) begin insert into localizationresources ([resourcekey], modificationdate, author, fromcode, ismodified, ishidden) values ('{property.Key}', getutcdate(), 'type-scanner', 1, 0, {Convert.ToInt32(property.IsHidden)}) set @resourceId = SCOPE_IDENTITY()"); // add all translations foreach (var propertyTranslation in property.Translations) { sb.Append($@" insert into localizationresourcetranslations (resourceid, [language], [value]) values (@resourceId, '{propertyTranslation.Culture}', N'{ propertyTranslation.Translation.Replace("'", "''") }') "); } sb.Append(@" end "); } if (existingResource != null) { sb.AppendLine($"update localizationresources set fromcode = 1, ishidden = {Convert.ToInt32(property.IsHidden)} where [id] = {existingResource.Id}"); if (existingResource.IsModified.HasValue && !existingResource.IsModified.Value) { foreach (var propertyTranslation in property.Translations) { AddTranslationScript(existingResource, sb, propertyTranslation); } } } } using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings[ConfigurationContext.Current.ConnectionName].ConnectionString)) { var cmd = new SqlCommand(sb.ToString(), conn) { CommandTimeout = 60 }; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } }); }