LINQ查询with子句绑定到列

时间:2018-08-30 19:41:59

标签: c# linq bitwise-and

我遇到了这个LINQ语句,经过详尽的谷歌搜索之后,我还没有找到全面的解释:

var x = Context.TableName
               .AsNoTracking()
               .Where(x => (x.ColumnName & 2) == 2)
               .Select(x => new {col = x.Column})
               .ToList();

我没有完全理解的部分是这里的.Where子句。

.Where(x => (x.ColumnName & 2) == 2)

我不确定该值是否解析为'AND'子句?

其他信息: 发现&表示按位AND运算符。但是如何将其应用于现有价值?例如,如果“列”值为514,则正在检索它,但如果它是512,则未检索它。我只想了解按位检查如何在所述值(514,512)中检查其适用性。

编辑:错别字按3。应该是2!

3 个答案:

答案 0 :(得分:2)

假设ColumnName是整数或某种其他整数类型,则(x.ColumnName & 2)将按位与。由于2在二进制演算中是0000 0000 0010,所以表达式(x.ColumnName & 2) == 2表示x.ColumnName的值必须与二进制演算中的模式**** **** ***1*匹配。

例如,如果x.ColumnName的值为514,则(x.ColumnName & 2)的结果将为

0010 0000 0010 (514)
&
0000 0000 0010 (2)
= 
0000 0000 0010 (2)

,表达式(x.ColumnName & 2) == 2将返回true

如果x.ColumnName的值为512,则(x.ColumnName & 2)的结果将为

0010 0000 0000 (512)
&
0000 0000 0010 (2)
= 
0000 0000 0000 (0)

,表达式(x.ColumnName & 2) == 2将返回false

答案 1 :(得分:1)

这种方法可让您测试x.ColumnName的二进制表示形式的第二个最低有效位是否已设置:

  • val & 2掩盖了第二个最低有效位以外的其他位
  • 2进行比较,以检查该位是否设置为1

这将转换为依赖RDBMS的按位AND运算符(SQL Server中的运算符&)。

答案 2 :(得分:0)

检查此表

enter image description here

仅当XY为真时,X&Y为真。否则,它是错误的。 二进制数字2是10。因此,X&2将始终返回2 (二进制10或0 例如:

15&2 = 2

1111 (15)
&
0010 (2)
= 
0010 (2)

13&2 = 0

1101 (13)
&
0010 (2)
= 
0000 (0)

This文章真的很有帮助