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

Задача следующая, нужно данные из 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
19.08.2015, 15:55
    #39032541
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка. Как из ToArray() с генерировать запросы
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
20.08.2015, 04:45
    #39032816
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка. Как из ToArray() с генерировать запросы
buserNechto, через жо...Можно и не через "жо": Enumerable.Aggregate - метод
buserДля массовой вставки не нужно так делать... для этого есть SqlBulkCopy или OracleBulkCopy или что вы там используете...
Почти для каждой популярной бд имеются механизмы оптимизированный под массовую вставку....Массовая вставка одним батчем может работать достаточно быстро, чтобы не использовать "булк", имеющий свои ограничения.
...
Рейтинг: 0 / 0
20.08.2015, 08:41
    #39032854
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка. Как из ToArray() с генерировать запросы
Алексей КМассовая вставка одним батчем может работать достаточно быстро, чтобы не использовать "булк", имеющий свои ограничения.

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

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

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

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

Надо снимать метрики. Я загружал БД в несколько гигов через контекст, без трекинга... было достаточно быстро. С батчем быстрее, но тогда можно попрощаться со всеми плюшками контекста, никакого разруливания навигационных связей, никакого M:M, никакого участия бизнес-логики... т.е. тут надо понимать что нужно и чем придётся пожертвовать.
...
Рейтинг: 0 / 0
20.08.2015, 12:13
    #39033056
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка. Как из ToArray() с генерировать запросы
hVosttС батчем быстрее, но тогда можно попрощаться со всеми плюшками контекста, никакого разруливания навигационных связей, никакого M:M, никакого участия бизнес-логики... т.е. тут надо понимать что нужно и чем придётся пожертвовать.Это да.
...
Рейтинг: 0 / 0
20.08.2015, 12:49
    #39033088
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка. Как из ToArray() с генерировать запросы
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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Задачка. Как из ToArray() с генерировать запросы / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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