1

当我点击以下行时,无论连接Roles表中是否出现“本地”,我总是收到一个 true。

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

我的语法正确吗?

4

7 回答 7

10

您正在寻找:

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

您正在做的是选择一系列bools。例如,如果您的查询返回了 3 个项目false, true, false,那么您要求该false, true, false序列的表达式,而不仅仅是位于它为真的位置的对象。看起来您正在尝试选择该系列布尔值为真的值,这意味着您应该使用Where而不是Select. 但是,由于您真正在做的Where就是Count检查至少一个,所以您应该这样做Any,这样做效率更高。

于 2012-05-10T15:06:24.787 回答
7

你需要的是Where

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

或者Any它甚至更好(并且性能更好,因为在大多数情况下它不会像这样遍历整个集合Count()

 if (objUserRoles.Any(x => x.Role.Role1 == "local"))
于 2012-05-10T15:06:16.193 回答
1

使用Where扩展方法

它检查条件

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

或者

任何扩展方法

if (objUserRoles.Any(x => x.Role.Role1 == "local"))
于 2012-05-10T15:06:25.660 回答
1

我认为您想使用 .Where(expr) 而不是 .Select(expr)。

于 2012-05-10T15:06:45.147 回答
1

最好有一个Any

if (objUserRoles.Where(x => (x.Role.Role1 == "local")).Any())
于 2012-05-10T15:07:04.383 回答
1

正如其他人指出的那样, .Any() 或 .Where().Count() 将为您提供所需的内容。你的代码...

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

...实际上是IEnumerable<bool>在创建一个基于x.Role.Role1 == "local". 您的最终结果始终为真,因为除非您的 objUserRoles 集合实际上包含 0 个元素,否则.Count()您的IEnumerable<bool>将始终大于 0。

希望澄清对您有意义!:)

于 2012-05-10T15:13:29.310 回答
0

好吧,您的 are not 语句将您中的任何内容转换objUserRoles为 a boolean,因此结果集

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"))
于 2012-05-10T15:09:46.067 回答