2015-05-11 3 views
0

Вот первый запрос для XML:Используйте первый результат XML во втором запросе XML

var doc = XDocument.Parse(p.text); 
var texts = doc.Descendants("Text") 
    .Where(e => (string)e.Attribute("section") == SectionName) 
    .Select(e => new Text 
     { 
      AudioList = (string)e.Attribute("audio"), 
      Content = (string)e.Value, 
      Group_Name = (string)e.Attribute("group") 
     }) 
    .Distinct(); 

и хотите использовать результат запроса в второй, который

var audio = XDocument.Parse(p.audio); 
var audios = audio.Descendants("Audio") 
    .Where(
     (e => e.Attribute("group") == (texts.Where(dr => dr.Group_Name))) 
     && 
     (e => e.Attribute("File_name")) == (texts.Where(dr => dr.AudioList)) 
    ) 
    .Select(e => new Audio 
     { 
      Path = (string)e.Attribute("Path") 
     }) 
    .Distinct(); 

XML:

<Texts> 
    <Text group="Outbuilding0">blank</Text> 
    <Text group="Study0" audio="abc.wav" section="Walls and skirting">[[Walls and skirting]] </Text> 
    <Text group="Study0" audio="c.wav" section="Walls and skirting">[[Walls and skirting]] </Text> 
</Texts> 
    <Audio group="Outbuilding0"> 
    <File_name>2013042517364073_Outbuilding0_1.wav</File_name> 
    <Path>/Job_Files/74/2_Outbuilding0/Audio/2013042517364073_Outbuilding0_1.wav</Path> 
    <Size>32</Size> 
    <Audio_length>00:00:04</Audio_length> 
    </Audio> 

Но показывает мне ошибку can not convert implicitly from string to bool, в каком состоянии ..Что такое правильно?

+1

Что вы пытаетесь сделать с этой частью: 'Где (dr => dr. group_name) '? –

+0

Можете ли вы показать нам образец вашего xml? –

+0

Я хочу сравнить групповое имя группы с именем группы audios @ MártonMolnár –

ответ

1

Ваша ошибка исходит от

Where(dr => dr.Group_Name).

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

.Where(dr => dr.Group_Name == e.Group_Name)

Я не совсем уверен, что вы после этого, но,

XDocument document = XDocument.Load("data.xml"); 

      var texts = from t in document.Descendants("Text") 
         select new 
         { 
          AudioList = t.Attribute("audio") != null ? t.Attribute("audio").Value : string.Empty, 
          Content = t.Value, 
          Group_Name = t.Attribute("group") != null ? t.Attribute("group").Value : string.Empty 
         }; 

      var audio = from a in document.Descendants("Audio") 
         let groupName = a.Attribute("group") != null ? a.Attribute("group").Value : string.Empty 
         let fileName = a.Element("File_name") != null ? a.Element("File_name").Value : string.Empty 
         let t = texts.Where(t => t.Group_Name == groupName && t.AudioList == fileName) 
         where t.Any() 
         select new 
         { 
          Path = a.Element("Path").Value 
         }; 

Что вам нужно сделать, это проверить, что в списке текстов содержится запись для аудио, которое вы используете. Я думаю, что это ваш запрос. Очевидно, что если все выйдет пустым, вы получите результат (я не уверен, какие предположения вы делаете о схеме)

+0

Мне нужно проверить имя группы аудио с аудиорепродуктами с текстом .. Я не могу получить то, что есть 'e.Group_Name)' –

+0

Так что-то вроде '.Where (e => texts.Any (t => t.GroupName == e. Атрибут ("группа"))) && texts.Any (t => t.AudioList == e.Attribute ("File_name")) '? (не могу отлаживать ваш или мой код прямо сейчас, но в основном, @Hammerstein прав, вам нужно писать где-то вроде. .Where (x == y) ', но у вас есть только' Where (x) '- x what .. –

+1

@ Hammerstein - вы можете просто передать атрибут в строку - если он равен null, он возвращает null: например '(string) t.Attrbute (" audio ")' будет возвращать то же, что и 't.Attribute (" audio "), ! = null? t.Attribute («audio»). Значение: null'. Делает для более легкого чтения! –

Смежные вопросы