2017-10-05 44 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 - 然後請用這個解釋更新問題,上面的解決方案將爲您解決問題 –

相關問題