ГДЕ В ОБЛАСТИ ДЛЯ LINQ to XML - PullRequest
       2

ГДЕ В ОБЛАСТИ ДЛЯ LINQ to XML

0 голосов
/ 08 ноября 2010

Следующий код должен возвращать все штрих-коды, которые есть в фильтре.однако, кажется, что фильтр исключен только при первой новой записи.

xml содержит 5 новых записей с подэлементом штрих-кода в диапазоне 1-5.если фильтр содержит 1,3 и 4, он возвращает 1, а если фильтр содержит 2,3 и 4, он возвращает нет записей.

Также текущая настройка (rpa.XMLData.Elements ("NEWFILE").Elements ("NEWRECORD")) возвращает 5 строк.я пытался увидеть, что произойдет, если я изменю это на возврат в одной строке (rpa.XMLData.Elements ("NEWFILE")), но это делает то же самое, возвращая мне 1 результат, являющийся первым попаданием, игнорируя 3 и 4.

есть ли способ изменить этот оператор LINQ для фактического просмотра всех штрих-кодов?

edit: информация поступает из тестового атм, поэтому извините, если она выглядит немного странно.я добавил информацию о xml и фильтре.

Кроме того, я нашел что-то дополнительное по проблеме, если фильтр

содержит 1,2,3, он работает.фильтр содержит 1,2,4, он вернет 1 и 2, а не 4.

он, кажется, ломается, когда не может найти решение.

String string2Stream = String.Concat("2", Environment.NewLine, "3", Environment.NewLine, "4", Environment.NewLine, "End");
        Stream reader = new MemoryStream(ASCIIEncoding.Default.GetBytes(string2Stream));
   StreamReader read = new StreamReader( reader );
   var filter = Enumerable.Where(StreamReaderToSeq(read), x => { int temp; return int.TryParse(x, out temp); });


   var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
               where filter.Contains(p.Element("BAR_CODE").Value)
               select new { p.Element("BAR_CODE").Value };   

Под xml, который я удалилмного дополнительных вещей, которые не должны быть связаны.

<?xml version=\"1.0\"?>
<NEWFILE>

<NEWRECORD num=\"1\"><MAILSORT></MAILSORT><BAR_CODE>1</BAR_CODE>
 </NEWRECORD> 

<NEWRECORD num=\"2\"><MAILSORT></MAILSORT><BAR_CODE>2</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"3\"><MAILSORT></MAILSORT><BAR_CODE>3</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"4\"><MAILSORT></MAILSORT><BAR_CODE>4</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"5\"><MAILSORT></MAILSORT><BAR_CODE>5</BAR_CODE>  
</NEWRECORD>

</NEWFILE>

Ответы [ 2 ]

1 голос
/ 08 ноября 2010
var filter = new List<string> {"1", "2", "4"};

var query = from p in barcode.Descendants("BAR_CODE")
            where filter.Contains(p.Value)
            select p.Value;

Я не был уверен, куда вы шли с созданным вами фильтром, но я думаю, что это довольно безопасный запрос.Это удобно, потому что работает, даже если BAR_CODE пусто.

0 голосов
/ 08 ноября 2010

В качестве альтернативного ответа, Этот показывает, как заставить его работать без содержимого, но с сохранением потока.

, преобразованный в мой код, тоже работает.

НО почемуСоздается ли Contains, если он выходит из строя, в то время как происходит сбой, в то время как он работает нормально, если вы заменяете поток списком или если вы заменяете Contains на JOIN.Кто-нибудь знает ответ на этот вопрос?

      var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
                join f in filter on
                    p.Element("BAR_CODE").Value equals f.ToString()                    
                select p; 

или

       var projectsMemberWorkedOn =
                    rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD")
                    .Join(filter, p => p.Element("BAR_CODE").Value, f => f.ToString(), 
                        ( p, f ) => new { p, f } ) 
                        .Select(@t => @t.p ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...