2013-05-17 39 views
0

需要一些幫助我有這個查詢,我想要什麼,如果材料組列表中的任何材料是可比較的返回true。需要一些有點複雜的LINQ查詢

mgroup.MaterialGroups.Select(x => x.Materials 
            .Any(m => Convert.ToBoolean(m.Comparable))) 
            .Any(x => x.Equals(true)) 

我想添加到此查詢中的還包括這一個。

mgroup.Materials.Any(m => Convert.ToBoolean(m.Comparable)); 

如何在查詢中將mgroup和materialgroups結合在一起,以便我可以選擇兩種材質?謝謝。

編輯 - 與LINQ戰鬥一段時間後,我崩潰了,剛剛合併爲

mgroup.Materials.Any(m => Convert.ToBoolean(m.Comparable) || 
mgroup.MaterialGroups.Select(x => x.Materials 
        .Any(c => Convert.ToBoolean(c.Comparable)))                                 
        .Any(x => x.Equals(true))) 

它工作正常,但它是可怕的長,它嵌入在Asp.net MVC以使事情變得更差。如果任何人都可以簡化這將是驚人的。

PS-如果你想知道爲什麼我在它的,因爲沒有它的查詢返回的bool,而不是布爾的IEnumerable末尾添加多餘的。任何(X => x.Equals(真)。

回答

1
IEnumerable<Material> allMaterials = 
         mgroup.Materials.Concat(
         mgroup.MaterialGroups.SelectMany(group => group.Materials)); 
bool result = allMaterials.Any(m => Convert.ToBoolean(m.Comparable)); 
+0

謝謝,但遺憾的是,只有當mgroup.MaterialGroup具有可比較的材料,但只有當mgroup本身具有可比材料時纔會返回true,纔會返回true。我發佈的第二個查詢僅適用於後者,而我僅發佈第一個查詢如果可能,我試圖將它們合併成一個聲明 – Smith

+0

@Smith好吧,現在我明白了,新代碼能工作嗎? –

+0

是的,它確實有效。這不是一個簡單的查詢嗎?或者我可以不要LINQ不夠。大聲笑在你看來,哪一個更適合在視圖中使用?聲明IEnumerable僅用於條件是不好的? – Smith