В предыдущем вопросе Я спросил о том, как логически сгруппировать элементы XML, и получил ответ, который заключался во вложении запроса Linq.
Проблема в том, что это приводит к левому присоединению к вложенным запросам. Например, допустим, я хочу перечислить все города в США, которые начинаются с буквы «Y», сгруппированные по штатам и округам:
XElement xml = new XElement("States",
from s in LinqUtils.GetTable<State>()
orderby s.Code
select new XElement("State",
new XAttribute("Code", s.Code),
new XAttribute("Name", s.Name),
from cy in s.Counties
orderby cy.Name
select new XElement("County",
new XAttribute("Name", cy.Name),
from c in cy.Cities
where c.Name.StartsWith("Y")
orderby c.Name
select new XElement("City",
new XAttribute("Name", c.Name)
)
)
)
);
Console.WriteLine(xml);
Это выводит:
<States>
<State Code="AK" Name="Alaska ">
<County Name="ALEUTIANS EAST" />
<County Name="ALEUTIANS WEST" />
<County Name="ANCHORAGE" />
<County Name="BETHEL" />
...
<County Name="YAKUTAT">
<City Name="YAKUTAT" />
</County>
<County Name="YUKON KOYUKUK" />
</State>
<State Code="AL" Name="Alabama ">
<County Name="AUTAUGA" />
...
etc.
Я не хочу эффекта левого соединения; Я хочу видеть только штаты и округа, в которых есть города, начинающиеся с буквы "Y".
Я могу придумать несколько способов сделать это, но все они кажутся капризными и не элегантными. Какой самый лучший способ достижения желаемого эффекта?