@Nposk

Как быстро отсортировать и выбрать данные из 10000+ строк таблицы в C#?

Данные хранятся в XML файле, данных более 10000 строк. Как быстро отобрать нужные данные?
  • Вопрос задан
  • 318 просмотров
Пригласить эксперта
Ответы на вопрос 2
k1lex
@k1lex
Программист торг. сети. C# (WPF, WinForms), T-SQL
Еще вариант на уровне MS SQL распарсить файл, сделать необходимы отбор и передать данные в приложение.
Ниже даю пример парсинга xml-файла в таблицу. Попробуйте переделать под себя
Взял кусок из рабочего примера, где использовались пространства имен в файле. Если у вас их нет - удалите
declare @xdat xml 

-- получаем xml-файл
SET @xdat  = (SELECT [DataXml]  FROM [TaskXml]  where TaskDocGUID='1A91AED3-B5DF-4526-81E9-D54C16BB82A7')

if object_id('TempDb..#AllDataTable') > 0 drop table #AllDataTable
SELECT Product.ref.value('declare namespace pref="http://fsrar.ru/WEGAIS/ProductRef";  (pref:Type/text())[1]', 'nvarchar(50)') AS [Type]
	,Product.ref.value('declare namespace   pref="http://fsrar.ru/WEGAIS/ProductRef";  (pref:FullName/text())[1]', 'nvarchar(255)') AS FullName
	,Product.ref.value('declare namespace   pref="http://fsrar.ru/WEGAIS/ProductRef";  (pref:ShortName/text())[1]', 'nvarchar(64)') AS ShortName
	,Product.ref.query('declare namespace   pref="http://fsrar.ru/WEGAIS/ProductRef";   pref:Producer[1]') AS Producer
	,Producer.ref.value('declare namespace  oref="http://fsrar.ru/WEGAIS/ClientRef";   (oref:ClientRegId/text())[1]', 'nvarchar(50)') AS ClientRegIdProducer
	,Producer.ref.value('declare namespace  oref="http://fsrar.ru/WEGAIS/ClientRef";   (oref:INN/text())[1]', 'nvarchar(255)') AS INNProducer
INTO #AllDataTable
FROM @xdat.nodes('declare namespace rap="http://fsrar.ru/WEGAIS/ReplyAP";
				  declare namespace ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01";
				  /ns:Documents/ns:Document/ns:ReplyAP/rap:Products/rap:Product') AS Product(ref)
CROSS APPLY Product.ref.nodes('declare namespace  pref="http://fsrar.ru/WEGAIS/ProductRef";  pref:Producer') AS Producer(ref)

 SELECT * FROM #AllDataTable


Код выше трудно читаем и понимаем. Попробую дать пример попроще

-- формируем докумет
DECLARE @xdat XML = (
		SELECT TOP 5 GUID
			,StatusDoc
		FROM V_EGAIS.dbo.ActChargeOnHeader
		FOR XML path('List')
			,ROOT('Document')
			,ELEMENTS
			,type
		)

-- ниже пример того что получилось
--  <Document>
--  <List>
--    <GUID>7F705894-441F-4B59-B6C4-0003579AE9BA</GUID>
--    <LDM>2016-02-04T15:58:01.650</LDM>
--  </List>
--  <List>
--    <GUID>D6EADAEB-AD45-4EB9-962D-0003B82CB431</GUID>
--    <LDM>2016-02-04T15:59:51.723</LDM>
--  </List>
--  <List>
--    <GUID>84BA1332-7C1F-4BAB-9923-0003D4B2CD7A</GUID>
--    <LDM>2016-02-04T15:58:57.443</LDM>
--  </List>
--  <List>
--    <GUID>A56EF787-3549-43DD-99E8-00043ED70C11</GUID>
--    <LDM>2016-02-04T15:56:59.223</LDM>
--  </List>
--  <List>
--    <GUID>16939553-7927-4221-B260-00044EBC225F</GUID>
--    <LDM>2016-02-04T15:57:29.297</LDM>
--  </List>
--</Document>
-- теперь производим выборку
SELECT Document.ref.value('(GUID/text())[1]', 'nvarchar(255)') AS [GUID]
	     ,Document.ref.value('(StatusDoc/text())[1]', 'int') AS StatusDoc
FROM @xdat.nodes('/Document/List') AS Document(ref) -- тут мы показываем с какого раздела можно начинать брать данные.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы