Запрос Linq to XML работает при возврате одного объекта, но должен иметь список <T> - PullRequest
0 голосов
/ 06 января 2011

Учитывая этот XML:

<foo>
   <xxx>Some XXX</xxx>
   <bar Attr1="true">Some Bar</bar>     
   <bar Attr2="true">Some Bar #2</bar>
   <bar>Some Bar #3</bar>
   <bar>Some Bar #4</bar>
</foo>

У меня есть этот запрос LINQ:

var foos = from query in xmlData.Descendants("foo")
       from bars in query.Elements("bar")
       select new FooClass
       {
    xxx = (string)query.Element("xxx"),
    barCollection = new BarClass
    {
        display = bars.Value,
        attr1Exists = (answers.Attribute("Attr1") != null ? true : false)
        attr2Exists = (answers.Attribute("Attr2") != null ? true : false)
        }
       };

Это прекрасно работает, если barCollection определена как BarClass.

Однако мне нужно, чтобы это был Список .

Я пробовал другие подходы и заставил это работать, если bar - это List :

var foos = from query in xmlData.Descendants("foo") 
select new FooClass 
{ 
    xxx = (string)query.Element("xxx"), 
    bar = query.Elements("bar").Select(x => x.Value).ToList() 
};

Но я не могу найти способ смешать их.

Может кто-нибудь показать, как объединить два решения, чтобы BarCollection заполнялся как пользовательский тип, а именно List ?

Обновление: окончательный рабочий код, приведенный ниже, с использованием предоставленных решений

var foos = from query in xmlData.Descendants("foo") 
select new FooClass 
{ 
    xxx = (string)query.Element("xxx"), 
    bar = query.Elements("bar").Select(x => new BarClass
    {
        display = x.Value,
        attr1Exists = x("Attr1") != null ? true : false),
        attr2Exists = x("Attr2") != null ? true : false)
        }

    ).ToList() 
};

Ответы [ 2 ]

0 голосов
/ 06 января 2011

Итак ... слегка перефразируя ваш вопрос ....

вы хотите, чтобы класс Foo имел коллекцию BarClasses в качестве одного из своих свойств?

List<BarClass> mybars = Foo.Bars; // is this your aim?

Если этоправильно, тогда вам не нужно выбирать многие (ваш второй из предложения)

вы бы сделали что-то почти так же, как ваш второй подход ....

  var foos = from query in xmlData.Descendants("foo")      
  select new FooClass
  {          
       xxx = (string)query.Element("xxx"), 
       Bars = query.Elements("bar").Select(x => new BarClass()
          {
             Attr1 = .. /// etc
             Attr2 = ....
          }).ToList();
  } 
0 голосов
/ 06 января 2011

Изменить .Select(x => x.Value) на .Select(x => new BarClass(...)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...