MongoDB C# 属性序列化,使用字符串和 int 值进行查询

问题描述 投票:0回答:1

我想查询一些“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
已存储为字符串的记录。

我不太了解这个问题,但我怀疑驱动程序很难序列化它,因此忽略了整数。有没有办法配置它,以便查询找到两者?

c# mongodb enums mongodb-.net-driver
1个回答
1
投票

是的,当您应用

[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)
);
© www.soinside.com 2019 - 2024. All rights reserved.