2014-10-17 79 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

相關問題