2017-10-05 36 views
-5

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

这甚至有可能吗?我该怎么做?

+2

太多的伪代码,我不明白。为什么你需要那里的琴弦?你的来源是什么,变量是什么,预期的结果是什么? –

+3

为什么你甚至会把它放在一个字符串中呢? – nvoigt

+0

尽管我在下面给出了一个答案,但我相信这是你的意思,请澄清你想要做什么以及为什么要使用字符串?你在使用MoreLinq或类似的东西吗? –

回答

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>()); 
} 
+0

好吧,我会尽力描述我的问题。我想从一定深度得到一个物体。我必须从中获取此对象的我的集合是一个由包含对象等的对象组成的集合。如果我只在集合上做一次SelectMany,我只能到达第二级别的对象。如果我做SelectMany()。SelectMany(两次)我可以达到第三级。所以我需要一个适用于所有级别的通用解决方案,我真的不知道该怎么做 – coder2017

+0

@ coder2017 - 然后请用这个解释更新问题,上面的解决方案将为您解决问题 –

相关问题