c# - 使用 MongoDB 的官方 C# 驱动程序的按位枚举(标志)查询

标签 c# linq mongodb mongodb-.net-driver bitwise-operators

当我尝试运行以下形式的 LINQ 查询时:

MongoCollection<MyEntity> collection;

collection.AsQueryable().Where(entity =>
    (entity.Flags & MyFlags.AFlag) != MyFlags.None);

我得到一个 ArgumentException 消息 Unsupported where clause: ((Int32)((Int32)entity.Flags & 4) != 0).

这是已知错误/功能吗?

有什么解决方法吗?

来自documentation MongoDB 似乎有按位更新,但没有按位查询。

为了比较,使用 ServiceStack 作为客户端,相同的查询在 Redis 上顺利运行。

我确实找到了这两个链接(link1link2),它们建议使用 JavaScript,但是,这会使服务层的实现非常依赖于数据库技术。

最佳答案

从 MongoDB v 3.2 开始,您可以使用 bitsAllSetbitsAnySet取决于您要搜索什么。

因此,使用 C# MongoDB 驱动程序:

//Check single Flag as OP
collection.Find(Builders<MyEntity>.Filter.BitsAllSet(myEntity => myEntity.Flags, (long) MyFlags.AFlag));

//Check all multiple Flags
collection.Find(Builders<MyEntity>.Filter.BitsAllSet(myEntity => myEntity.Flags, (long) MyFlags.AFlag | MyFlags.BFlag));

//Check any multiple Flag
collection.Find(Builders<MyEntity>.Filter.BitsAnySet(myEntity => myEntity.Flags, (long) MyFlags.AFlag | MyFlags.BFlag));

注意:有一个open issue在按位运算上使用索引。在 MongoDB 4.2 上,他们仍然不使用它们,所以如果您计划大量使用它们,请注意(我们曾经并且我们必须在之后重构所有内容)。

关于c# - 使用 MongoDB 的官方 C# 驱动程序的按位枚举(标志)查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17415046/

相关文章:

c# - 如何将原始 HTTP 响应解析为 HttpListenerResponse?

c# - C#/.NET 3.5 中的转换如何适用于具有 '?' 的类型

c# - 在 .Where() 内嵌套 .Select()

visual-studio-2010 - LINQ 性能改进

mongodb - 有没有更好的方法将 mongodb 查询导出到新集合?

c# - 如何调用WebMethod?

c# - asp.net面板控件可见性问题

c# - Entity Framework - 如何查询多个表并选择要显示的列

mongodb - 使用多个装饰器将 Type-GraphQL 与 Typegoose 结合起来

arrays - 获取元素 mongodb 聚合的索引