ORMLite 中的按位标志

Bitwise flag in ORMLite

我的数据库 table 中有一个按位标志列,我想要 select 没有特定标志的行。例如,我想检索未停用的客户列表。

我用 ORMLite 写的

var q = db.Select<Customer>().where(c => (c.Flags & CustomerFlag.Deactive) != CustomerFlag.Deactive);

但是当我观察 ORMLite 在调试中生成的查询时,'&' 变成了 'AND'。 所以我得不到我想要的。

我也用过HasFlag。但是ORMLite好像不支持

有人有解决办法吗?

p.s: 数据库是 SQLite

这在 OrmLite 中没有实现。单个 AND & 甚至起作用的事实纯属巧合。

查看来源 here,向下滚动到此方法:

protected virtual string BindOperant(ExpressionType e)

switch 语句列出了转换为 SQL 运算符的二元运算符。请注意,列表中缺少 ExpressionType.And;只有 ExpressionType.AndAlso 存在。

因此,ExpressionType.And属于default的情况:

default:
    return e.ToString();

这与返回 AND 相同,SQL 解释为逻辑 AND

此问题没有解决方法。

由于项目的源代码是免费提供的,您可以提交此问题的修复程序。解决方案可能就像将这四行添加到 SqlExpression.cs 文件中的 switch 语句一样简单:

case ExpressionType.And:
    return "&";
case ExpressionType.Or:
    return "|";

我讨厌回答我自己的问题。但似乎我终于找到了答案。如果有人遇到同样的问题,我会写下来以提供帮助。

实际上我用原始 sql 条件替换了 lambda 的 'bitwise' 部分:

var q = db.Select<Customer>().Where($"(Flags & {(int)CustomerFlag.Deactive} != {(int)CustomerFlag.Deactive}");

因此生成的查询如下:

select * from customer where (flag & 8) <> 8