Как то так?
XElement myElement = XElement.Parse(xmlstring);
int resultValue = 17;
int age = 26;
string genderValue = "female";
IEnumerable<string> query =
myElement.Descendants("ResultValue")
.Where(rv => ((int)rv.Attribute("low")) <= resultValue)
.Where(rv => ((int)rv.Attribute("high")) >= resultValue)
.Where(rv => rv.Ancestors("Age")
.Any(a => ((int) a.Attribute("low")) <= age && ((int) a.Attribute("high")) >= age)
)
.Where(rv => ((string)rv.Ancestors("Gender").Single().Attribute("type")) == genderValue)
.Select(rv => rv.Ancestors("Result").Single().Element("Description").Value);
foreach (string x in query)
Console.WriteLine(x);
Идея состоит в том, что вы можете представить форму столбца-строки, где каждая строка является ResultValue. Каждое значение результата имеет одного родителя Age, одного родителя Gender и одного родителя Result.
ResultValue.Low
ResultValue.High
Age.Low
Age.High
Gender.Type
Result.Description
Фактически, можно проецировать вышеупомянутый xml в эту форму:
var query2 = myElement.Descendants("ResultValue")
.Select(rv => new
{
ResultValue = rv,
Age = rv.Ancestors("Age"),
Gender = rv.Ancestors("Gender"),
Result = rv.Ancestors("Result")
})
.Select(x => new XElement("Data",
new XAttribute("ResultValue.Low", (int)x.ResultValue.Attribute("low")),
new XAttribute("ResultValue.High", (int)x.ResultValue.Attribute("high")),
new XAttribute("Age.Low", (int)x.Age.Attributes("low").Single()),
new XAttribute("Age.High", (int)x.Age.Attributes("high").Single()),
new XAttribute("Gender.Type", (string) x.Gender.Attributes("type").Single()),
new XAttribute("Result.Description", (string) x.Result.Elements("Description").Single())
));
foreach (XElement x in query2)
Console.WriteLine(x);