ORMLite中的按位标志

时间:2017-07-23 11:55:20

标签: c# linq sqlite lambda ormlite

我的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

2 个答案:

答案 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