将字符串放入linq表达式?

时间:2017-10-05 08:14:40

标签: c# linq

我需要做一个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(.......);

这甚至可能吗?我该怎么办?

1 个答案:

答案 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>());
}