我需要做一个LINQ表达式,其表达式取决于预期节点在层次结构中的深度。
所以我在这样的字符串上使用concat:
var parString = string.Concat(Enumerable.Repeat(".SelectMany(f => f.level)", level));
所以,如果它的深度为4级,我会得到字符串:
string1 = ".SelectMany(f => f.level).SelectMany(f => f.level).SelectMany(f => f.level).SelectMany(f => f.level)"
然后我想在LINQ表达式中使用这个字符串,例如:
List + string1 + .FirstOrDefault(.......);
这甚至可能吗?我该怎么办?
答案 0 :(得分:4)
使用for循环确定调用.SelectMany
的次数:
var query = List;
for(int depth = 4; depth > 0; depth--)
{
query = query.SelectMany(f => f.level);
}
// Materialize query with `FirstOrDefault` or anything you need
请注意,目前如果达到最大深度并仍然继续,您将获得例外。要解决这个问题,您可以添加if语句来检查f.level
是否为空或不为空,具体取决于您的逻辑。类似的东西:
for(int depth = 4; depth > 0; depth--)
{
query = query.SelectMany(f => f.level ?? Enumerable.Empty<YourType>());
}