Linq 到 sql ! int 类型的可空运算符

Linq to sql ! operator for nullable of type int

sql 列 ReadershipLevels - int 为 null

level是局部int类型变量

&bitwise 运算符

链接到 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 中也将其更改为 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 查询中添加 ! 运算符?

尝试更改: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;

或者,如果您不想显示 readershiplevels 值为“32”的记录,则进行简单检查,

vAdvanceSearchResults = from t 
                    in vAdvanceSearchResults 
                    where (t.ReadershipLevels ?? 0) != 32 
                    select t;

希望对您有所帮助

这对你有用。您不需要使用 & 运算符

vAdvanceSearchResults = from t 
                        in vAdvanceSearchResults 
                        where t.ReadershipLevels.Value != level && t.ReadershipLevels.Value > 0 
                        select t;