我的db表中有一个按位标志列,我想选择没有某个标志的行。例如,我想检索未停用的客户列表。
我在ORMLite中写这个
var q = db.Select<Customer>().where(c => (c.Flags & CustomerFlag.Deactive) != CustomerFlag.Deactive);
但是当我看到ORMLite在调试中生成的查询时,&#39;&amp;&#39;转向&#39; AND&#39;。 所以我无法得到我想要的东西。
我也使用过HasFlag。但似乎ORMLite不支持它。
有人有解决方案吗?
p.s:DB是SQLite
答案 0 :(得分:2)
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
。
此问题没有解决方法。
由于项目源是免费提供的,您可以提交此问题的修复程序。解决方案可能就像将这四行添加到switch
文件中的SqlExpression.cs
语句一样简单:
case ExpressionType.And:
return "&";
case ExpressionType.Or:
return "|";
答案 1 :(得分:0)
我讨厌回答我自己的问题。但似乎我终于找到了答案。如果有人遇到同样的问题,我会把它写下来帮助。
实际上我用原始sql编码替换lambda的'按位'部分:
var q = db.Select<Customer>().Where($"(Flags & {(int)CustomerFlag.Deactive} != {(int)CustomerFlag.Deactive}");
生成的查询如下:
select * from customer where (flag & 8) <> 8