Dans un previous question j'ai demandé comment grouper les éléments XML logiquement, et j'ai eu la réponse, qui était d'imbriquer la requête Linq.Linq/XML: regrouper les résultats correctement dans l'élément XML - avec des jointures internes!
Le problème est que ceci a pour effet de joindre à gauche les requêtes imbriquées. Par exemple, disons que je veux énumérer toutes les villes aux Etats-Unis qui commencent par la lettre « Y », regroupées par État et comté:
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);
Ce sorties:
<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.
Je ne Je veux l'effet de jointure à gauche; Je veux seulement voir les états et les comtés qui contiennent réellement des villes commençant par la lettre "Y".
Je peux penser à quelques façons de le faire, mais ils semblent tous kludgy et inélégant. Quel est le meilleur moyen de parvenir à l'effet désiré?
Excellent! Merci de m'avoir montré comment faire le groupement imbriqué en utilisant le type anonyme - cela vous donne le crédit de la réponse! :) –