2014-10-17 48 views
4

尝试读取DataContext类这样运算符'&&'不能应用于'bool'和'bool'类型的操作数吗?

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 
    }); 
} 

所以,问题是在where子句我需要得到用户的谁是角色(1,2)& &的isValid == true,如果是的isValid“空'把它弄错。 谢谢

回答

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 
+0

感谢@ sudhAnsu63,但我不想过滤u.isValid == null的位置。我想获得记录,其中u.isValid == true,如果u.isValid为null(避免编译错误,将其转换为null为false) – sky 2014-10-17 14:35:22

+0

但只返回记录,其中u.isValid == true – sky 2014-10-17 14:36:07

+0

我已更新我的回答(第二个)。 1stOne已经按预期工作。 – sudhAnsu63 2014-10-17 14:39:16

12

你必须把它包在括号:迷茫

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

位与(u.isValid?假的),这是否并不意味着如果 u.isValid == null,则将其设为false,并查找其中的u.isValid为false的用户,这不是我想要的。

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

但是输了'== true' – 2014-10-17 13:49:09

+0

谢谢蒂姆。这意味着过滤如果u.isValid == true并且u.isValid为null,则过滤u.isValid == false。那是对的吗? – sky 2014-10-17 14:09:52

+0

如果这是正确的,那么我不希望这种行为,我只想在isValid == true的情况下返回。由于isValid是可以为空的,我想将它设为false以避免错误,并只返回isValid为true的记录。 – sky 2014-10-17 14:16:42

4

鉴于bool将默认为false反正你可以使用GetValueOrDefault

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

注 - GetValueOrDefault不会出现由EF支持 - see ticket

+0

这特别好,因为'GetValueOrDefault()'是一个没有额外逻辑的裸露字段。 – 2014-10-17 13:50:12

+0

'GetValueOrDefault()'没有被EntityFramework翻译为SQL – AlexFoxGill 2014-10-17 13:51:37

+0

@AlexG这是我心中唯一的疑问 - 你能证实这确实是这种情况吗? – James 2014-10-17 13:52:17

相关问题