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;

Надеюсь, поможет

Другие вопросы по тегам