private XmlQueryCardinality AddDescendantParticle(List<XmlQueryType> list, Dictionary<XmlQualifiedName, XmlQueryCardinality> allTypes, XmlSchemaParticle particle, XmlQueryType filter) {
XmlQueryCardinality card = XmlQueryCardinality.None;
XmlSchemaElement element = particle as XmlSchemaElement;
if (element != null) {
// Single element
XmlQueryType elementType = CreateElementType(element);
// Add it
card = AddFilteredPrime(list, elementType, filter);
// Descend
card += AddElementOrTextDescendants(list, allTypes, elementType.SchemaType, filter);
}
else {
XmlSchemaAny any = particle as XmlSchemaAny;
if (any != null) {
// Descendants of any
card = AddFilteredPrime(list, Element, filter);
}
else {
XmlSchemaGroupBase group = particle as XmlSchemaGroupBase;
if (group.Items.Count != 0) {
if (particle is XmlSchemaChoice) {
foreach (XmlSchemaParticle p in group.Items) {
card |= AddDescendantParticle(list, allTypes, p, filter);
}
}
else { // Sequence and All
foreach (XmlSchemaParticle p in group.Items) {
card += AddDescendantParticle(list, allTypes, p, filter);
}
}
}
}
}
return card * CardinalityOfParticle(particle);
}