运营商&&'不能应用于'bool'和'bool?'类型的操作数

时间:2014-10-17 13:44:21

标签: c# linq

尝试像这样读取一个dataContext类

var users = new List<User>();
var roles = new int[] { 1, 2 };
// here I need to get users who's role is in role (1, 2), hence above line
// and also I need to get user who's isValid field true, please note that isValid is SQL 'bit' field and is nullable
//This is what I am doing
foreach (var user in dataContext.Users
                                .Where(u => roles.Contains(u.RoleID.Value)
                                            && u.isValid ?? false == true)) // here '&&' part I'm struggling and getting above error
{
    users.Add(new User()
    {
         // Users Added in collection
    });
}

所以问题在于我需要在哪个条款中让用户担任角色(1,2)&amp;&amp; isValid == true,如果isValid是&#39; null&#39;把它弄错。 谢谢

3 个答案:

答案 0 :(得分:20)

你必须将它包装在括号中:

roles.Contains(u.RoleID.Value) && (u.isValid ?? false)
  

有点困惑(u.isValid ?? false),这不代表if   u.isValid == null然后将其设为false并查找用户在哪里   u.isValid是假的,这不是我想要的。

不,这只是意味着nulls被视为false并且所有用户都被isValid既不是null也不是false。它有效,因为?? - 运算符会将Nullable<bool>转换为bool,因此您可以将其与&&一起使用。我不喜欢它,我更喜欢我后来理解的显式代码:

roles.Contains(u.RoleID.Value) && u.isValid.HasValue && u.isValid.Value

或使用== - 运算符与bool?

更简单
roles.Contains(u.RoleID.Value) && u.isValid == true

答案 1 :(得分:6)

鉴于bool默认为false,您可以使用GetValueOrDefault

roles.Contains(u.RoleID.Value) && u.isValid.GetValueOrDefault()

注意 - EF似乎不支持GetValueOrDefault - see ticket

答案 2 :(得分:2)

你可以这样试试。

 foreach (var user in dataContext.Users
          .Where(u => roles.Contains(u.RoleID.Value) 
             && (u.isValid ?? false))) // note the bracket around (u.isValid ?? false)

foreach (var user in dataContext.Users
       .Where(u => roles.Contains(u.RoleID.Value) 
        && (u.isValid.HasValue && u.isValid))) //you can use HasValue to check for null