5

次の形式の LINQ クエリを実行しようとすると、次のようになります。

MongoCollection<MyEntity> collection;

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

ArgumentExceptionはメッセージでUnsupported where clause: ((Int32)((Int32)entity.Flags & 4) != 0).

これは既知のバグ/機能ですか?

回避策はありますか?

ドキュメントから、MongoDB にはビットごとの更新があるようですが、ビットごとのクエリはないようです。

比較のために、ServiceStack をクライアントとして使用して、同じクエリが Redis 上でスムーズに実行されます。

JavaScript の使用を示唆するこれら 2 つのリンク ( link1 、 link2 ) を見つけまし、サービス層の実装が DB テクノロジに大きく依存するようになります。

4

2 に答える 2

11

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));

: Bitwise 操作でインデックスを使用するには未解決の問題があります。MongoDB 4.2 では、それらはまだ使用されていないため、それらを大量に使用する予定がある場合は注意してください (私たちは使用しており、後ですべてをリファクタリングする必要がありました)。

于 2016-06-14T12:03:19.080 に答える