2015-09-09 29 views
0

我想有可能在運行時添加查詢。我的解決方案與「老」司機是這樣的。MongoDB在運行時添加查詢與C#驅動程序> 2.0

// A List does hold the queries 
    List<IMongoQuery> QueryConditionList = new List<IMongoQuery>(); 

    void AddQuery(string sType, string sField, string sValue) 
    { 
     // I can add of course several Queries 
     if (sType == "EQ") 
      QueryConditionList.Add(Query.EQ(sField, sValue)); 
     else if (sType == "GT") 
      QueryConditionList.Add(Query.GT(sField, sValue)); 
     else if (sType == "LT") 
      QueryConditionList.Add(Query.LT(sField, sValue)); 
    } 
    // At some point you can execute the queries 
    void ExecuteQuery() 
    { 
     // Combine all to on "And" Query ("Or" would be possible as well) 
     IMongoQuery query = Query.And(QueryConditionList); 
     // Then I can get my cursor with a Find 
     MongoCursor<BsonDocument> mc = MoCollection.Find(query); 

     // Do anything with the cursor... 
    } 

這確實工作得很好。但我不知道如何用新的語法來做到這一點。 我所有的方法都不是真正的動態。像:

var builder = Builders<BsonDocument>.Filter; 
var filter = builder.Eq(Field1, Value1) & builder.Eq(Field2, Value2); 

我想我可以添加一些更多的過濾器一樣

filter.add(builder.Eq(Field3, Value3)); // But of course I can't 
+0

builder.And的存在和工作方式與Query.And完全相同。 –

+0

謝謝,但它不是'我'所缺少的,它是在運行時將查詢列表添加到過濾器的可能性。 –

+0

https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/FilterDefinitionBuilder.cs#L81這需要IEnumerable的FilterDefinitions。也許一個你不能做的例子會有所幫助。 –

回答

0

下面是如何能夠使用新的API來完成。

// A List does hold the queries 
List<FilterDefition<BsonDocument>> QueryConditionList = new List<FilterDefition<BsonDocument>>(); 

void AddQuery(string sType, string sField, string sValue) 
{ 
    // I can add of course several Queries 
    if (sType == "EQ") 
     QueryConditionList.Add(Builders<BsonDocument>.Filter.Eq(sField, sValue)); 
    else if (sType == "GT") 
     QueryConditionList.Add(Builders<BsonDocument>.Filter.Gt(sField, sValue)); 
    else if (sType == "LT") 
     QueryConditionList.Add(Builders<BsonDocument>.Filter.Lt(sField, sValue)); 
} 

Task ExecuteQueryAsync() 
{ 
    // The And method takes an IEnumerable<FilterDefinition<BsonDocument>>. 
    var filter = Builders<BsonDocument>.Filter.And(QueryConditionList); 
    var results = await MoCollection.Find(query).ToListAsync(); 
} 
相關問題