I’ve got some code that needs to scan through a hierarchical database schema, looking for properties defined in the schema that have certain interesting properties. I want to make a (flat) list of the names of these properties.
To (hopefully) reduce confusion, I’ll call the classes that are defined in the schema “Kinds”, because the schema does not describe a C# class hierarchy.
The schema is available to me as a tree of .NET objects; I don’t need to parse any XML or anything. The issue is that I’ll be entering the schema tree at various points, and I need to make sure that I’m aware of interesting properties that are being inherited from base kinds as well as those that are directly defined on the kind that I’m currently looking at.
results = new List<PropertyDefinition>;
foreach (Kind objKind in objDescription.PossibleKinds)
{
// Iterate up the schema hierarchy
while (objKind != null)
{
foreach (PropertyDefinition prop in objKind.PropertyDefinitions)
{
if (prop.IsInteresting)
results.Add(prop);
}
// Move up a level in the hierarchical relationship
objKind = objKind.BaseKind;
}
}
Anyway, I’m wondering if it’s possible to write an equivalent LINQ statement. The outermost foreach loops are trivial (there’s actually another one that I’ve left out for clarity) but I’m not sure whether it’s possible to capture the iteration up the hierarchy in a LINQ query.
var query = from objKind in objDescription.PossibleKinds
// What goes here?
from prop in objKind.PropertyDescriptions
where prop.IsInteresting
select prop;
I guess this is similar to writing a LINQ query that starts with a node in a linked list and keeps iterating through the linked list until it gets to the end. Is that possible?
You can’t really do this with ‘pure’ LINQ, but you can mix this with an enumerator method, and you’d be on the right track. For instance, define an extension method on the
Kindtype like this:Now you can use this method in your LINQ query: