Извлечение элементов из XML C # и выполнение массового удаления

User987 спросил: 22 октября 2018 в 09:17 в: c#

У меня есть фрагмент кода, который выглядит следующим образом:

string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\DeletedItems\" + "DeletedItems" + ".xml";
            XDocument xmlDoc = XDocument.Load(filePath);
            var list = xmlDoc.Root.Elements("ItemID")
                                       .Select(element => element.Value)
                                       .ToList();
            var idsList = FormItemIdList(list);            ctx.zsp_deleteEndedItems(idsList);
            ctx.zsp_deleteEndedItemsTransactions(idsList);

Эта часть кода загружает все элементы из файла XML:

var list = xmlDoc.Root.Elements("ItemID")
                 .Select(element => element.Value)
                 .ToList();

Где XML-файл выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<ItemsToDelete>
  <ItemID>113347292264</ItemID>
  <ItemID>113334066205</ItemID>
  <ItemID>113331816848</ItemID>
  <ItemID>113191634415</ItemID>
  <ItemID>183480362055</ItemID>
  <ItemID>113303425739</ItemID>
  <ItemID>112533425202</ItemID>
  <ItemID>112007496785</ItemID>
  <ItemID>111956371906</ItemID>
  <ItemID>112016647700</ItemID>
</ItemsToDelete>

Как только элементы загружены в список из C #, я формирую строку, которая выглядит следующим образом:

113347292264,113334066205... etc etc

Затем строка передается в хранимую процедуру, которая выглядит следующим образом:

create procedure [dbo].[zsp_deleteEndedItems]
(
@ItemIDList nvarchar(max)
)
as
delete from 
SearchedUserItems
WHERE EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@ItemIDList,',') S1 WHERE ItemID=S1.val) 

Затем вызывается функция SplitStringProduction, чтобы разбить переданную строку. и удалите записи в БД на основе переданного идентификатора элемента:

create FUNCTION [dbo].[SplitStringProduction]
(
  @string nvarchar(max),
  @delimiter nvarchar(5)
) RETURNS @t TABLE
(
  val nvarchar(500)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'  insert into @t(val)
  select 
    r.value('.','varchar(500)') as item
  from @xml.nodes('//root/r') as records(r)  RETURN
END

Теперь все это работает нормально, но есть некоторые проблемы, о которых я знаю и которые мне бы хотелось чтобы избежать:

  1. Список из файла XML может быть очень длинным, часто содержащий более 100000 записей внутри

Теперь, чтобы избежать этого, я подумал сделать следующее:

  • Выполните удаление в пакетах по 5000 записей, скажем,

Таким образом, шаги будут такими:

  • Извлечь 5000 элементов из файла XML
  • Передайте эти 5000 элементов в процедура
  • Удалить 5000 ItemID из файла XML

Может кто-нибудь помочь мне с этим, я не уверен, как это сделать?


0 ответов