2012-05-10 20 views
1

當我點擊下面的行時,無論在加入Roles表中是否出現「本地」,我總是會收到一個true。LINQ選擇查詢總是導致真值

if (objUserRoles.Select(x => (x.Role.Role1 == "local")).Count() > 0) 

我的語法正確嗎?

+1

看起來不錯,但避免'.Count()> 0'支持'.Any()'。格式列舉了整個列表,只要找到一個結果,後者就會退出。 – Jamiec

回答

6

你需要的是Where

if (objUserRoles.Where(x => x.Role.Role1 == "local").Count() > 0) 

或用Any它甚至更好(和高性能的,因爲在大多數情況下,它不會重複低谷整個集合類似Count()

if (objUserRoles.Any(x => x.Role.Role1 == "local")) 
+1

+1爲注意到主要錯誤(我沒有!),但仍然,使用'任何'超過'Count()> 0' – Rawling

+0

爲什麼它不會迭代?當沒有像'.Any()'定義的謂詞時,它不會迭代。在你的情況下,它的任何(x => x.Role.Role1 ==「本地」))''。 Lambda變量已定義,因此它將迭代。 –

+0

不,它會在第一個項目後停止,而另一方面'Count()'''x.Role.Role1 =='local''將始終遍歷整個集合。但是,如果沒有合適的項目,或者它是最後一次迭代整個集合,那麼你是對的。 – nemesv

10

您要找的東西:

if (objUserRoles.Any(x => x.Role.Role1 == "local")) 

你正在做的是選擇一系列bool s。例如。如果您有3件商品的查詢返回false, true, false,則表示您要求該false, true, false順序,而不僅僅是該位置的對象。它看起來像你試圖選擇那些布爾系列是真的值,這意味着你應該使用Where而不是Select。但是,由於您真的在使用WhereCount正在檢查至少一個,所以您應該做Any,這樣做效率更高。

1

使用Where擴展方法

它檢查條件

if (objUserRoles.Where(x => (x.Role.Role1 == "local")).Count() > 0) 

OR

Any擴展方法

if (objUserRoles.Any(x => x.Role.Role1 == "local")) 
1

我想你想使用.Where(expr)而不是.Select(expr)。

1

它是一個Any

if (objUserRoles.Where(x => (x.Role.Role1 == "local")).Any()) 
0

好不好,你不聲明變換你的objUserRolesboolean任何東西,所以結果集的

objUserRoles.Select(x => (x.Role.Role1 == "local")) 

IEnumerable<bool>與作爲你的objUserRoles集合中的很多元素。 我猜你想通過下面的查詢

if (objUserRoles.Where(x => x.Role.Role1 == "local").Count() > 0) 

甚至更​​好的描述

if (objUserRoles.Any(x => x.Role.Role1 == "local")) 
1

正如其他人所指出的事,。任何()或。凡()。COUNT()會給你你想要的。你的代碼...

if (objUserRoles.Select(x => (x.Role.Role1 == "local")).Count() > 0) 

...實際上是創建一個IEnumerable<bool>其中每個項目是真/假基於x.Role.Role1 == "local"。您的最終結果總是如此,因爲IEnumerable<bool>.Count()將始終大於0,除非您的objUserRoles集合實際上包含0個元素。

希望澄清對你有意義! :)