Mongodb C# 驱动程序忽略 Null 和空列表 (ToBsonDocument)

问题描述 投票:0回答:2
ConventionRegistry.Register("IgnoreIfDefault", 
                            new ConventionPack { new IgnoreIfDefaultConvention(true) }, 
                            _ => true);

var bsonDocument = anon.ToBsonDocument();

使用 IgnoreIfDefaultConvention 可能会导致意外行为,因为它会影响所有默认值。例如,下面列出的值将不会被保存:

int = 0
decimal = 0
bool = false

如果我只想忽略空值和空数组最好的方法是什么?

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

我自己没有使用它,但我认为答案是这个约定:

IgnoreIfNullConvention
。您还可以为特定字段配置特定约定:

BsonClassMap.RegisterClassMap<test>(c => c.MapField(e => e.A).SetIgnoreIfNull(ignoreIfNull: true));

或使用此属性

BsonIgnoreIfNullAttribute

更新: 如果您需要更复杂的约定,您始终可以实现自定义约定:https://mongodb.github.io/mongo-csharp-driver/2.12/reference/bson/mapping/conventions/


0
投票

这是我们用来忽略空集合的自定义属性:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class BsonIgnoreIfEmpty : Attribute, IBsonMemberMapAttribute
{
    public void Apply(BsonMemberMap memberMap)
    {
        // Get the member where the attribute is applied
        MemberInfo memberInfo = memberMap.MemberInfo;

        memberMap.SetShouldSerializeMethod(entity =>
        {
            // Get value of memberInfo
            var member = memberInfo switch
            {
                FieldInfo field => field.GetValue(entity),
                PropertyInfo property => property.GetValue(entity),
                _ => null
            };

            if (member is IEnumerable collection)
            {
                // Check if collection is empty
                return collection.GetEnumerator().MoveNext();
            }

            return false;
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.