2016-02-01 11 views
6

Considerate le seguenti strutturefortemente tipizzato interrogazione sul campo nidificato utilizzando MongoDB C conducente # 2.2

public class Parent 
{ 
    public ObjectId Id { get; set; }  
    public IEnumerable<Child> Children { get; set; } 
} 

public class Child 
{ 
    public string Value { get; set; } 
} 

vorrei trovare tutti i genitori oggetto i cui valori figli sono un superset di un array cioè

var parents = new List<Parent>(); 
var values = new[] { "A", "B", "C" }; 
parents.Where(x => !values.Except(x.Children.Select(y => y.Value)).Any()); 

o

{ "Children.Value": { $all: ["A", "B", "C"] } } 

Mi piacerebbe farlo in modo dattiloscritto ma il traduttore predicato non supporta It umerable.Select quindi questo non funzionerà:

Builders<Parent>.Filter.All(x => x.Children.Select(y => y.Value), values); 

Attualmente sto usando questa soluzione:

var filters = values.Select(x => Builders<Parent>.Filter.Where(y => y.Children.Any(z => z.Value == x))); 
Builders<Parent>.Filter.And(filters); 

Esiste un modo migliore senza utilizzare una stringa di nome di campo magia?

+1

Avete mai capito questo? Devo fare qualcosa di simile ... –

risposta

0
IMongoClient _client = new MongoClient(@"mongodb://..."); 
IMongoDatabase _database = _client.GetDatabase("..."); 
IMongoCollection<Parent> _collection = _database.GetCollection<Parent>("q35135879"); 
var ca = new Child { Value = "A" }; 
var cb = new Child { Value = "B" }; 
var cc = new Child { Value = "C" }; 
var fdb = Builders<Parent>.Filter; 
var filterLinq = fdb.All (x=>x.Children, new[] {ca, cb, cc}); 
var filterFieldDefinition = fdb.All("Children", new[] { ca, cb, cc }); 
var found1 = _collection.Find(filterLinq).ToList(); 
var found2 = _collection.Find(filterFieldDefinition).ToList(); 
CollectionAssert.AreEqual(found1, found2);