当我尝试运行以下形式的 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 上顺利运行。
我确实找到了这两个链接(link1,link2),它们建议使用 JavaScript,但是,这会使服务层的实现非常依赖于数据库技术。
最佳答案
从 MongoDB v 3.2 开始,您可以使用 bitsAllSet或 bitsAnySet取决于您要搜索什么。
因此,使用 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/