Как мне создать более сложный одиночный запрос LINQ to XML? - PullRequest
0 голосов
/ 02 июня 2010

Я новичок в LINQ, поэтому следующее может оказаться очень простым и очевидным, когда на него дан ответ, но я должен признать, что этот вопрос пинает меня в задницу.

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

<measuresystems>
  <measuresystem name="SI" attitude="proud">
    <dimension name="mass" dim="M" degree="1">
      <unit name="kilogram" symbol="kg">
        <factor name="hundredweight" foreignsystem="US" value="45.359237" />
        <factor name="hundredweight" foreignsystem="Imperial" value="50.80234544" />
      </unit>
    </dimension>
  </measuresystem>
</measuresystems>

Я могу запросить значение коэффициента преобразования между килограммами и американским весом, используя следующую LINQ to XML, но, несомненно, есть способ объединить четыре последовательных запроса в один сложный запрос?

XElement mss = XElement.Load(fileName);

IEnumerable<XElement> ms =
    from el in mss.Elements("measuresystem")
    where (string)el.Attribute("name") == "SI"
    select el;

IEnumerable<XElement> dim =
    from e2 in ms.Elements("dimension")
    where (string)e2.Attribute("name") == "mass"
    select e2;

IEnumerable<XElement> unit =
    from e3 in dim.Elements("unit")
    where (string)e3.Attribute("name") == "kilogram"
    select e3;

IEnumerable<XElement> factor =
    from e4 in unit.Elements("factor")
    where (string)e4.Attribute("name") == "pound" 
        && (string)e4.Attribute("foreignsystem") == "US"
    select e4;

foreach (XElement ex in factor)
{
    Console.WriteLine ((string)ex.Attribute("value"));
}

1 Ответ

2 голосов
/ 02 июня 2010

Это будет работать, просто сложите их вместе:

IEnumerable<XElement> ms =
    from el in mss.Elements("measuresystem")
    where (string)el.Attribute("name") == "SI"
    from e2 in el.Elements("dimension")
    where (string)e2.Attribute("name") == "mass"
    from e3 in e2.Elements("unit")
    where (string)e3.Attribute("name") == "kilogram"
    from e4 in e3.Elements("factor")
    where (string)e4.Attribute("name") == "pound" 
        && (string)e4.Attribute("foreignsystem") == "US"    
    select e4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...