2015-05-27 35 views
0

SQL列的可空ReadershipLevels - int与空Linq to sql!运营商为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改变同样以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查询添加一个!操作?

+0

为什么你要'''在这里。你可以像这样检查'(t.ReadershipLevels.Value&level)<0'。不大于0意味着它小于零。 –

+0

对不起,我想用32排除所有记录,所以不使用。 – user1282609

+0

(t.ReadershipLevels.Value&level)<0 results empty set,我想排除level = 32的记录。 – user1282609

回答

2

这会为你工作。你不需要使用&运营商

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

尝试改变:where ! (t.ReadershipLevels.Value & level) > 0
这样:where ! ((t.ReadershipLevels.Value & level) > 0)

1

为什么我们在这里需要位运算符?

在你的问题中提到,如果您使用的条件,

not ([t2].[ReadershipLevels] & 32) > 0 

它将检索 (1〜31),(64〜95),(128至159),并与ReadershipLevels值的所有结果等等。

如果你真的想表明,像在上面你提到范围内记录可以使用如下的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; 

希望它可以帮助