Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用c#驱动程序根据mongodb中的字节属性查询集合_C#_Mongodb_Linq_Mongodb Query_Mongodb .net Driver - Fatal编程技术网

使用c#驱动程序根据mongodb中的字节属性查询集合

使用c#驱动程序根据mongodb中的字节属性查询集合,c#,mongodb,linq,mongodb-query,mongodb-.net-driver,C#,Mongodb,Linq,Mongodb Query,Mongodb .net Driver,我是mongodb的新手,我正在尝试使用byte属性查询集合,但是我得到了一个无效的强制转换异常。总之, public class MongoDbAddressCollection { private IMongoCollection<Addresses> collection = database.GetCollection<Addresses>("AddressCollection"); public IEnumerable<Addr

我是mongodb的新手,我正在尝试使用byte属性查询集合,但是我得到了一个无效的强制转换异常。总之,

public class MongoDbAddressCollection    
{
     private IMongoCollection<Addresses> collection = database.GetCollection<Addresses>("AddressCollection");
     public IEnumerable<Addresses> Where(System.Linq.Expressions.Expression<Func<Addresses, bool>> filter = null)
     {
         var items = collection.AsQueryable().Where(filter);
         if (items == null)
             return null;
         return items.ToList();
     }
}

public class Test
{
    public void DoSomthingWithAddresses()
    {
         MongoDbAddressCollection addressCollection=new MongoDbAddressCollection();
         //exception occurs in MongoDbAddressCollection.Where method when executing the ToList().
         List<Addresses> homeAddresses=addressCollection.Where(x=>x.AddressType==(byte)EnumAddressType.HomeAddress);
         foreach(var address in homeAddresses)
         {
            //do stuff
         }
    }
}
实际上,问题似乎是mongodb和.net之间的类型不匹配,我可以看到WorkAddress实体的AddressType是10,它是2的二进制表示形式。但是,在我将所有实体中的所有字节属性插入集合之前,除了将它们更改为int之外,我想不出其他解决方案(我们在不同实体中有许多字节属性)。。。或者可以通过查询中的解决方法(linq where条件)解决此问题


感谢高级。

字节类型的序列化确实存在问题。我认为最快的解决方案是将
AddressType
属性的类型从
byte
更改为
EnumAddressType

public class Address
{
    public Guid UserId { get; set; }
    public string Street { get; set; }
    public EnumAddressType AddressType { get; set; }
}
并在不使用强制转换的情况下编写过滤器:

var filter = Builders<Address>.Filter
    .Where(x => x.AddressType == EnumAddressType.HomeAddress);
作为一种替代方法,您可以编写自定义字节序列化程序,并使用以下方法进行注册:

BsonClassMap.RegisterClassMap<Address>(cm =>
{
    cm.AutoMap();
    cm.GetMemberMap(c => c.AddressType).SetSerializer(MyCustomByteSerializer.Instance);
});

BsonClassMap.RegisterClassMap在此。

谢谢您的回答。将属性类型更改为enum实际上不是一个选项,因为该属性对应于数据库中的tinyint列,并且该实体是自动生成的。。。我尝试了自定义序列化程序,现在mongodb中的数据很好,但在执行Where(filter).ToList()方法时仍然出现异常。
public static BsonDocument RenderToBsonDocument<T>(FilterDefinition<T> filter)
{
    var serializerRegistry = BsonSerializer.SerializerRegistry;
    var documentSerializer = serializerRegistry.GetSerializer<T>();
    return filter.Render(documentSerializer, serializerRegistry);
}
var json = RenderToBsonDocument(filter).ToJson();
// Result: { "AddressType" : 1 }
BsonClassMap.RegisterClassMap<Address>(cm =>
{
    cm.AutoMap();
    cm.GetMemberMap(c => c.AddressType).SetSerializer(MyCustomByteSerializer.Instance);
});