2016-02-01 8 views
6

पर विचार करें निम्नलिखित संरचनाओंजोरदार MongoDB सी # ड्राइवर का उपयोग कर 2.2

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

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

मैं सभी माता पिता को खोजने के लिए चाहते हैं वस्तु जिसका बच्चों मूल्यों यानी

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

या किसी सरणी के एक सुपरसेट हैं नेस्टेड मैदान पर क्वेरी के लिखे

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

मैं इसे टाइप किए गए तरीके से करना चाहता हूं लेकिन अनुमानित अनुवादक एन का समर्थन नहीं करता है umerable.Select तो यह काम नहीं करेगा:

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

वहाँ एक जादू फ़ील्ड नाम स्ट्रिंग का उपयोग किए बिना एक बेहतर तरीका है:

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

मैं वर्तमान में इस समाधान का उपयोग कर रहा हूँ?

+1

क्या आपने कभी इसे समझ लिया था? मुझे ऐसा करने की ज़रूरत है ... –

उत्तर

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); 
संबंधित मुद्दे