powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Задачка. Как из ToArray() с генерировать запросы
10 сообщений из 10, страница 1 из 1
Задачка. Как из ToArray() с генерировать запросы
    #39032304
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Задача следующая, нужно данные из Excel переместить в базу данных.

Первое я делаю массовую выгрузку данных из Excel в ToArray()
Код: c#
1.
object[,] data = _sheet.Range["A2:D100"].Value;



Пример набора данных из data
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[1,1] | 10
[1,1] | 10
[1,2] | 12
[1,3] | 140
[1,4] | строка1
[2,1] | 103
[2,2] | 432
[2,3] | 13
[2,4] | строка2
[3,1] | 123
[3,2] | 434 
... и т.д.

Вторым шагом я хочу с генерировать запрос INSERT. Но как это сделать через linq не соображу :)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var query = data
   .Cast<???>
   .Select(s => 
               
             // ???

             ).ToList();

var result = string.Format("INSERT INTO TEST (A, B, C, D) VALUES ({0})", string.Join("), (",query)); 



На выходе result должно получиться такой:
Код: plaintext
1.
INSERT INTO TEST (A, B, C, D) VALUES (10, 12, 140, строка1), (103, 432, 13, строка2), (123, 434 ... и т.д.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39032541
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto, через жо...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void Main()
{
	object[,] data = { {1, 2, 3, "X"}, {5, 6, 7, "Y"} , {5, 6, 7, "Z"}};
	
	var query = data.Cast<object>()
				.Select((val, idx) => new{ val, idx } )
				.GroupBy(pair => pair.idx / 4)
				.Select(set => string.Format("({0})", string.Join(", ", set.Select(item => item.val.GetType() == typeof(string) ? string.Format("'{0}'", item.val) : item.val ).ToArray())));
	var str = string.Format("insert into test(a, y, z, txt) values {0}",  string.Join(",", query));
	str.Dump();
}



Для массовой вставки не нужно так делать... для этого есть SqlBulkCopy или OracleBulkCopy или что вы там используете...
Почти для каждой популярной бд имеются механизмы оптимизированный под массовую вставку....
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39032816
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserNechto, через жо...Можно и не через "жо": Enumerable.Aggregate - метод
buserДля массовой вставки не нужно так делать... для этого есть SqlBulkCopy или OracleBulkCopy или что вы там используете...
Почти для каждой популярной бд имеются механизмы оптимизированный под массовую вставку....Массовая вставка одним батчем может работать достаточно быстро, чтобы не использовать "булк", имеющий свои ограничения.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39032854
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМассовая вставка одним батчем может работать достаточно быстро, чтобы не использовать "булк", имеющий свои ограничения.

Если данных много, ещё можно отключить трекинг. Булк это когда данных совсем много, он очень ограниченный.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39032857
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КМассовая вставка одним батчем может работать достаточно быстро, чтобы не использовать "булк", имеющий свои ограничения.

Если данных много, ещё можно отключить трекинг.Батч запускается через DbCommand, трекинг тут не при чём.
hVosttБулк это когда данных совсем много, он очень ограниченный.Да.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39032940
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КБатч запускается через DbCommand, трекинг тут не при чём.

Не, я имею в виду затолкать данные пачками в DbContext и сделать SaveChanges, чтобы это было быстро, надо отключить трекинг. И оно реально достаточно быстро работает.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39032941
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КБатч запускается через DbCommand, трекинг тут не при чём.

Не, я имею в виду затолкать данные пачками в DbContext и сделать SaveChanges, чтобы это было быстро, надо отключить трекинг.Ну я так и понял.
hVosttИ оно реально достаточно быстро работает.Ну хз, у всех свои требования. Как по мне, так сохранять 200+ записей по 1 записи на батч - медленно.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39033053
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу хз, у всех свои требования. Как по мне, так сохранять 200+ записей по 1 записи на батч - медленно.

Надо снимать метрики. Я загружал БД в несколько гигов через контекст, без трекинга... было достаточно быстро. С батчем быстрее, но тогда можно попрощаться со всеми плюшками контекста, никакого разруливания навигационных связей, никакого M:M, никакого участия бизнес-логики... т.е. тут надо понимать что нужно и чем придётся пожертвовать.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39033056
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttС батчем быстрее, но тогда можно попрощаться со всеми плюшками контекста, никакого разруливания навигационных связей, никакого M:M, никакого участия бизнес-логики... т.е. тут надо понимать что нужно и чем придётся пожертвовать.Это да.
...
Рейтинг: 0 / 0
Задачка. Как из ToArray() с генерировать запросы
    #39033088
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buserNechto, через жо...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void Main()
{
	object[,] data = { {1, 2, 3, "X"}, {5, 6, 7, "Y"} , {5, 6, 7, "Z"}};
	
	var query = data.Cast<object>()
				.Select((val, idx) => new{ val, idx } )
				.GroupBy(pair => pair.idx / 4)
				.Select(set => string.Format("({0})", string.Join(", ", set.Select(item => item.val.GetType() == typeof(string) ? string.Format("'{0}'", item.val) : item.val ).ToArray())));
	var str = string.Format("insert into test(a, y, z, txt) values {0}",  string.Join(",", query));
	str.Dump();
}



Для массовой вставки не нужно так делать... для этого есть SqlBulkCopy или OracleBulkCopy или что вы там используете...
Почти для каждой популярной бд имеются механизмы оптимизированный под массовую вставку....

Спасибо! А про это почитаю SqlBulkCopy
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Задачка. Как из ToArray() с генерировать запросы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]