计算谓词,它是如何工作的?

时间:2014-09-04 12:11:24

标签: c# linq llblgen

使用linq查询我从数据库中检索列表。该列表包含包含属性RoleType的特定类的2项。 RoleType的类型是int。

第一个对象的属性值为0。 第二个对象的属性值为1。

我也有一个枚举:

enum RoleTypes
{
    Type1 = 1,
    Type2 = 0,
}

对枚举进行索引的奇怪顺序是给定的,我无法改变它。

我的业务规则规定,RoleType值Type2必须只有一个角色,而RoleType值Type1必须至少有一个角色。这是我用于此的代码:

var ExactlyOneRoleType2 = roles.Count(role => role.RoleType == (int)RoleTypes.Type2) == 1;
var AtLeastOneRoleType1 = roles.Any(role => role.RoleType == (int)RoleTypes.Type1);

根据我前面提到的列表,两个变量(ExactlyOneRoleType2和AtLeastOneRoleType1)都应该为true。至少,我希望如此。只有当我通过代码调试时才发现ExactlyOneRoleType2为false。经过一些研究后我发现了

roles.Count(role => role.RoleType == (int)RoleTypes.Type2)

返回2而不是1,我觉得很奇怪,因为RoleType Type2只有1个角色。为什么计数返回2?它也没有计算Any调用实际返回true的事实。如何包含2个项目的列表同时包含2个具有RoleType Type2的项目,并且至少有一个项目具有RoleType Type1?

当我将计数调用更改为

roles.Count(role => role.RoleType == 0)

它仍然返回2.仅当我将Count调用更改为:

private static bool IsRoleTypeType2(Role role)
{
    return role.RoleType == (int)RoleTypes.Type2;
}

roles.Count(IsRoleTypeType2)

计数返回1应该是。

这里发生了什么?当我使用匿名谓词时,为什么计数返回2?在计算数据的情况下,我是否误解了谓词的工作原理?或者这是Linq的错误吗?

0 个答案:

没有答案