当前位置: 首页 > 编程语言 > C#

BitwiseEnumeration(Flag)QueryUsingMongoDB'sOfficialC#Driver分享

时间:2023-04-11 11:04:31 C#

BitwiseEnumeration(Flag)QueryUsingMongoDB'sOfficialC#Driver当我尝试运行以下形式的LINQ查询时:MongoCollection集合;collection.AsQueryable().Where(entity=>(entity.Flags&MyFlags.AFlag)!=MyFlags.None);我收到消息Unsupportedwhereclause:((Int32)((Int32)entity.Flags&4)!=0)。ArgumentException不受支持的where子句:((Int32)((Int32)entity.Flags&4)!=0)。这是一个已知的错误/功能吗?有解决方法吗?从文档看来,MongoDB有按位更新,但没有按位查询。相比之下,使用ServiceStack作为客户端,同样的查询在Redis上顺利运行。我确实找到了这两个建议使用JavaScript的链接(link1,link2),这会使服务层的实现非常依赖于DB技术。我的解决方案有两个部分。我为枚举标志创建了一个序列化程序,它将所有值存储在一个字符串列表中。我为Linq创建了一个扩展方法来“注入”我需要的mongo查询。publicstaticIQueryableHasFlags(thisIQueryableitems,Expression>itemPropertyExpression,paramsEnum[]enumFlags){varenumFlagNames=enumFlags.Select(enumFlag=>(BsonValue)enumFlag.ToString());返回items.Where(item=>Query.In(ExtendedObject.GetPropertyName(itemPropertyExpression),enumFlagNames).Inject());这样,它既可读又不需要将所有对象反序列化到内存中。PS:GetPropertyName方法只是一种获取属性名称的类型安全方式:从MongoDBv3.2开始,您可以使用bitsAllSet或bitsAnySet,具体取决于您要搜索的内容。所以,使用C#MongoDB驱动:以上是C#学习教程:使用MongoDB官方C#驱动的按位枚举(flag)查询希望大家多多关注教程—//ChecksingleFlagasOPcollection.Find(Builders.Filter.BitsAllSet(myEntity=>myEntity.Flags,(long)MyFlags.AFlag));//检查所有多个Flagscollection.Find(Builders.Filter.BitsAllSet(myEntity=>myEntity.Flags,(long)MyFlags.AFlag|MyFlags.BFlag));//检查任何多个标志collection.Find(Builders.Filter.BitsAnySet(myEntity=>myEntity.Flags,(long)MyFlags.AFlag|MyFlags.BFlag));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢