2016-03-30 15 views
1

Ben mongodb için oldukça yeni ve bir koleksiyon bayt özelliği ile sorgulamaya çalışıyorum ancak geçersiz bir özel durum alıyorum. ,C# sürücüsüyle mongodb'de bir bayt özelliğine karşı bir koleksiyonu sorgulama

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

özetlemek Ve adres varlık

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 
} 

Aslında mesele MongoDB ve .net arasında bir tür uyumsuzluğu gibi görünüyor sınıf aşağıdaki gibidir için ben WorkAddress varlıklar için AddressType olduğunu görebiliriz 10'un ikili temsili olan 10 Ancak, tüm varlıklarımızdaki tüm bayt özelliklerini değiştirmeden başka bir çözümü düşünemiyorum. Bu koleksiyonları koleksiyonlara eklemeden önce (farklı varlıklarda çok sayıda bayt mülkümüz var) ... Veya Bu, sorgudaki bir geçici çözümle giderilebilir (koşul olarak linq)?

Gelişmiş teşekkürler.

cevap

1

Gerçekten de byte türünün serileştirilmesiyle ilgili bir sorun var. Bu yöntemi kullanarak filtreyi test edebilirsiniz

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

: Ben en hızlı çözüm döküm olmadan Filtrenizi EnumAddressType

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

için byte den AddressType mülkiyet türünü değiştirmek Ve yazmaya olacağını düşünüyorum

public static BsonDocument RenderToBsonDocument<T>(FilterDefinition<T> filter) 
{ 
    var serializerRegistry = BsonSerializer.SerializerRegistry; 
    var documentSerializer = serializerRegistry.GetSerializer<T>(); 
    return filter.Render(documentSerializer, serializerRegistry); 
} 

Sonuç

var json = RenderToBsonDocument(filter).ToJson(); 
// Result: { "AddressType" : 1 } 

alternatif bir yaklaşım olarak, özel bayt seri hale yazıp kullanarak kayıt olabilirsiniz:

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

Burada bir sample serializer code görebilirsiniz.

+0

Yanıt Mennan için teşekkürler. Özellik türünü enum olarak değiştirmek gerçekten bir seçenek değildir çünkü özellik veritabanındaki küçük bir sütuna karşılık gelir ve varlık otomatik olarak oluşturulur ... Özel seri hale getirmeyi denedim ve veriler şimdi mongodb'de gayet iyi ama yine de Where (filter) .ToList() yöntemini yürütürken istisna. –

İlgili konular