我想查询一些“A”的集合。类“A”有一个
Status
属性,其定义如下:
public class Status<T>
{
[BsonRepresentation(BsonType.String)] //<- this was added some time later!
public T Code { get; set; }
public DateTime Timestamp { get; set; }
public int UserId { get; set; }
}
所以
A
看起来像:
public class A
{
public Status<MyEnum> Status {get; set;}
}
其中
T
通常是一个枚举。我尝试这样查询:
var f = Builders<A>.Filter.Or(
Builders<A>.Filter.Eq("Status.Code", intStatus),
Builders<A>.Filter.Eq("Status.Code", stringStatus)
);
filterCondition &= f;
现在的问题是数据库中存在较旧的记录,其中
Status.Code
仍然是 int
。现在查询仅查找 Status.Code
已存储为字符串的记录。
我不太了解这个问题,但我怀疑驱动程序很难序列化它,因此忽略了整数。有没有办法配置它,以便查询找到两者?
是的,当您应用
[BsonRepresentation(BsonType.String)]
属性时,序列化程序会将 Code
字段值转换为 string
类型。
这种方法可能看起来丑陋,但使用
BsonDocument
将能够转义要序列化为string
的值。
var f = Builders<A>.Filter.Or(
new BsonDocument("Status.Code", intStatus),
Builders<A>.Filter.Eq("Status.Code", stringStatus)
);
另一种方法是将
intStatus
值作为 BsonValue
类型传递。
var f = Builders<A>.Filter.Or(
Builders<A>.Filter.Eq("Status.Code", BsonValue.Create(intStatus)),
Builders<A>.Filter.Eq("Status.Code", stringStatus)
);