使用位掩码逻辑的 Linq 联接



BitTable

Id1122
NameBitId
测试数据1
测试数据2
7测试数据34

LINQ 联接采用以下形式:

from x in table1
join y in table2 on f(x) equals g(y)
select ...

条件的形式必须为f(x) equals g(y)equals的LHS必须是table1中元素的函数,而RHS必须是table2中元素的函数。相反,您在这里拥有的是类似于f(x, y) equals g(x)的东西,它不是这种形式,因此您不能在此处使用join子句或Join方法。

解决方法是可靠的旧where子句:

var query = from bt in _context.BitTable
from bm in _context.BitMask
where (bm.DataMask & bt.BitId) == bt.BitId
where (bm.DataMask & 4) = 4
select new {
bt.Id, bt.Name, bt.BitId, bm.DataId, bm.DataMask
};
var dataMaskList = query.ToList();

HasFlag的替代方案:

var query = from bt in _context.BitTable
from bm in _context.BitMask
where bm.DataMask.HasFlag(bt.BitId) && bm.DataMask.HasFlag(MaskKeys.TestData3)
select new {
bt.Id, bt.Name, bt.BitId, bm.DataId, bm.DataMask
};
var dataMaskList = query.ToList();

最新更新