2014-11-13 3 views
1

Мое утверждение where явно не работает, но все, что я могу найти, это примеры того, как преобразовать его за пределы запроса LinQ. Самое близкое, что я могу найти:Невозможно неявно преобразовать тип 'bool?' to 'bool' в запросе LinQ?

&& rdoNoPhone.Checked ? d.PHONE!= null : true 

Но, я не совсем уверен, как это работает в моем случае. Я понимаю, что мое поле SQL под названием Active позволяет 3 значения, истины, false и null, и я предполагаю, что мой ответ - все в этом маленьком вопросительном знаке.

LinQtoSQLDataContext db = new LinQtoSQLDataContext(); 
        var query = from a in db.Admins 
           where a.Active = true 
           orderby a.Name 
           select new { a.Name, a.LoginName}; 

Я также должен спросить, как можно использовать инструкцию SQL IN в запросе LinQ. Например, изменение следующих в Linq:

Select Field1, Field2, Level 
From Table 
Where Level IN (1,2,5) 
+2

На оба вопроса был дан ответ ранее. Вы ищете 'nullableBool.HasValue && nullableBool.Value == true' и для вашего второго вопроса' new [] {1, 2, 5} .Contains (value) '. – CodeCaster

+1

'where a.Active = true': Вы уверены, что не имели в виду' == '? –

+0

Это сработало: nullableBool.HasValue && nullableBool.Value == true – Lore

ответ

4

Я считаю, что ваш знак равенства в линии where a.Active = true должен быть на самом деле два знака равенства (для обозначения сравнения, а не назначение). На самом деле, поскольку вы сравниваете bool с true, вам даже не нужен оператор сравнения. Вы можете просто написать a.Active.Value.

LinQtoSQLDataContext db = new LinQtoSQLDataContext(); 
        var query = from a in db.Admins 
           where a.Active.HasValue && a.Active.Value 
           orderby a.Name 
           select new { a.Name, a.LoginName}; 

Для вашего второго вопроса, то вы можете использовать Contains(value) для решения этой проблемы. Например:

int[] Levels = new int[] { 1, 2, 5 }; 
int Level = 2; 
if (Levels.Contains(Level)) 
{ 
    // Level was found in Levels 
}