2016-03-30 8 views
1

mongodbが新しく、バイトプロパティを持つコレクションをクエリしようとしていますが、無効なキャスト例外が発生しています。要約mongodbのバイトプロパティに対するコレクションをC#ドライバで照会しています

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 
     } 
    } 
} 

とクラス

public class Address 
{ 
    public Guid UserId { get; set; } 
    public string Street { get; set; } 
    public byte AddressType { get; set; } 
    ..... 
} 

public enum EnumAddressType 
{ 
    HomeAddress=1, 
    WorkAddress=2 
} 

次実際の問題は、MongoDBのと.NETの型の不一致であるように思わように、アドレスエンティティであるために、私はWorkAddressエンティティのAddressTypeにはあることがわかりますしかし、私はコレクションに挿入する前に、すべてのエンティティのすべてのエンティティのすべてのバイトプロパティをintに変更する以外の解決策は考えられません(別のエンティティには多くのバイトプロパティがあります)...またはこれは、問題の回避策(linq where条件)で修正できますか?

ありがとうございました。

答えて

1

実際にbyteタイプのシリアル化に問題があります。あなたは、このメソッドを使用して、フィルタをテストすることができ

var filter = Builders<Address>.Filter 
    .Where(x => x.AddressType == EnumAddressType.HomeAddress); 

:私は最速の解決策は、キャストせずにフィルタをEnumAddressType

public class Address 
{ 
    public Guid UserId { get; set; } 
    public string Street { get; set; } 
    public EnumAddressType AddressType { get; set; } 
} 

byteからAddressTypeプロパティの種類を変更し、書くことになると思います

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

はあなたがここにsample serializer codeを見ることができます。

+0

回答ありがとうございました。プロパティの型を列挙型に変更することは、プロパティがデータベースのtinyint列に対応し、エンティティが自動生成されるため実際にはオプションではありません...カスタムシリアルライザを試しましたが、mongodbではデータは正常ですが、 Where(filter).ToList()メソッドを実行しているときは例外です。 –

関連する問題