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
我的数据库 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