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;
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;