Linq to sql! оператор для обнуляемого типа int
Столбец sql ReadershipLevels
- int
с нулем
level
местный int
переменная типа
&
является bitwise
оператор
Linq to SQL
vAdvanceSearchResults = from t
in vAdvanceSearchResults
where (t.ReadershipLevels & level) > 0
select t;
если level = 32
Выше запроса Linq генерируется SQL, как показано ниже:
SELECT [t2].[ReadershipLevels],[t2].[ID], [t2].[ISBN], [t2].[IsHighlighted], [t2].[Title],
FROM (
SELECT DISTINCT [t1].[ID], [t1].[ISBN], [t1].[IsHighlighted], [t1].[Title], [t1].[SuluAuthors],
FROM [dbo].[udf_SearchDWSearch]('swim', 'ALL') AS [t0]
INNER JOIN [dbo].[DWSearch] AS [t1] ON [t0].[DWSearchID] = ([t1].[ID])
WHERE [t1].[DatePublished] < '2016/05/27'
) AS [t2]
WHERE ([t2].[ReadershipLevels] & 32) >0
order by [t2].[ReadershipLevels]
Я хочу включить not
Итак, я сделал как ниже
not ([t2].[ReadershipLevels] & 32) > 0
SELECT DISTINCT [t1].[ID], [t1].[ISBN], [t1].[IsHighlighted], [t1].[Title], [t1].[SuluAuthors],
FROM [dbo].[udf_SearchDWSearch]('swim', 'ALL') AS [t0]
INNER JOIN [dbo].[DWSearch] AS [t1] ON [t0].[DWSearchID] = ([t1].[ID])
WHERE [t1].[DatePublished] < '2016/05/27'
) AS [t2]
WHERE not ([t2].[ReadershipLevels] & 32) >0
order by [t2].[ReadershipLevels]
Который работает нормально.
Теперь я хочу изменить то же самое в LINQ to SQL
vAdvanceSearchResults = from t
in vAdvanceSearchResults
where ! (t.ReadershipLevels & level) > 0
select t;
Но вышеприведенная ошибка метания - не может применяться оператором! операнду типа System.Nullable
Изменился на -
vAdvanceSearchResults = from t
in vAdvanceSearchResults
where ! (t.ReadershipLevels.Value & level) > 0
select t;
Бросая ошибка - невозможно применить оператор !
операнду типа int
Как я могу добавить !
оператор в моем LINQ
запрос?
3 ответа
Это будет работать для вас. Вам не нужно использовать & оператор
vAdvanceSearchResults = from t
in vAdvanceSearchResults
where t.ReadershipLevels.Value != level && t.ReadershipLevels.Value > 0
select t;
Попробуйте изменить: where ! (t.ReadershipLevels.Value & level) > 0
к этому: where ! ((t.ReadershipLevels.Value & level) > 0 )
Зачем нам здесь побитовый оператор?
Как упоминалось в вашем вопросе, если вы используете это условие,
not ([t2].[ReadershipLevels] & 32) > 0
он будет получать все результаты со значением ReadershipLevels в (от 1 до 31),(от 64 до 95),(от 128 до 159) и так далее.
Если вы действительно хотите показать записи как в указанном выше диапазоне, вы можете использовать как ниже not ([t2].[ReadershipLevels] & 32) > 0
то же самое, что проверка равна 0,
vAdvanceSearchResults = from t
in vAdvanceSearchResults
where (t.ReadershipLevels.Value & level) == 0
select t;
Или, если вы не хотите показывать записи со значением читательского уровня "32", выполните простую проверку как,
vAdvanceSearchResults = from t
in vAdvanceSearchResults
where (t.ReadershipLevels ?? 0) != 32
select t;
Надеюсь, поможет