2017-01-09 36 views
-1

我有一個函數(見下文)。MongoDB C#創建一個函數,我可以傳遞一個類型/類名作爲參數

它的偉大工程什麼我需要做的,而且,我還有一個幾乎是除了這兩條線完全一樣的事情:

 var collection = MongoDB.GetCollection<RocketRequest>("RocketRequest"); 

     var filter = Builders<RocketRequest>.Filter.Eq("RocketRequestId", 4); 

我希望能夠以某種方式使功能動態的,所以我可以通過它,所以我可以使用這個相同的功能爲多種目的/類型,而不需要爲每一個創建一個新的功能。

對於上述2行我想看看是否有可能以某種方式將集合中的對象作爲參數傳遞給函數?

或者最壞的情況有一個switch語句來檢查我通過的字符串值,並說如果是這樣,設置它,否則將其設置爲別的。這樣做的問題是我無法在switch語句中創建變量,如果我嘗試在交換機外創建它,我必須將其作爲空對象(然後將集合設置爲交換機內所需的集合),然後我可以沒有得到那個工作。

 public static int MongoReadData(string[] MongoListOfFieldsToDisplay) 
    { 
     int CountRecords = 0; 

     // create connection TO MongoDB 
     MongoClient MongoClientConn = new MongoDatabaseConnection().mongoConn(); 
     var MongoDB = MongoClientConn.GetDatabase("Viper"); 
     var collection = MongoDB.GetCollection<RocketRequest>("RocketRequest"); 

     var filter = Builders<RocketRequest>.Filter.Eq("RocketRequestId", 4); 
     //var filter = Builders<RocketRequest>.Filter.Empty; 
     var result = collection.Find(filter).ToListAsync().Result; 

     // do here so it is after the filtering 
     CountRecords = Convert.ToInt32(collection.Find(filter).Count()); 

     return CountRecords; 

    }// end MongoReadData  
+0

不明白你需要什麼。你的函數返回count。你根本不需要foreach循環 –

+0

我還在玩東西,所以函數本身不是問題。我需要知道的是,如果我可以傳遞一些東西給函數,所以我可以改變MongoDB.GetCollection (「RocketRequest」);像這樣:MongoDB.GetCollection (「DynamicPassedToFunction」); – Brad

回答

0

我能找到的代碼,讓我通過作爲新的類,使其工作做我所需要的。看到新版本的函數和調用:

所以我調用相同的函數,並可以用它來查詢2個獨立的集合。

MongoReadData_ResponseTEST<RocketResponse>(Mongo_ListOfFieldsToDisplay_RocketResponse, "RocketResponse", "RocketResponseId"); 
MongoReadData_ResponseTEST<RocketRequest>(Mongo_ListOfFieldsToDisplay_RocketRequest, "RocketRequest", "RocketRequestId"); 


public static int MongoReadData_ResponseTEST<T>(string[] MongoListOfFieldsToDisplay, string CollectionName, string PKToSearchOn) where T : class, new() 
{ 
    int CountRecords = 0; 

    // create connection TO MongoDB 
    MongoClient MongoClientConn = new MongoDatabaseConnection().mongoConn(); 
    var MongoDB = MongoClientConn.GetDatabase("Viper"); 
    var collection = MongoDB.GetCollection<T>(CollectionName); 

    var filter = Builders<T>.Filter.Eq(PKToSearchOn, 4); 
    //var filter = Builders<RocketRequest>.Filter.Empty; 
    var result = collection.Find(filter).ToListAsync().Result; 

    // do here so it is after the filtering 
    CountRecords = Convert.ToInt32(collection.Find(filter).Count()); 

    return CountRecords; 

}// end MongoReadData  
1

如果我理解你想要什麼,你可以試試這個:

public IEnumerable<T> GetMongoData<T>(string collectionName, 
          Expression<Func<T,bool>> filter) 
{ 
    MongoClient MongoClientConn = new MongoDatabaseConnection().mongoConn(); 
    var MongoDB = MongoClientConn.GetDatabase("Viper"); 
    var collection = MongoDB.GetCollection<T>(collectionName); 

    return collection.Find(filter).ToEnumerable(); 
} 

示例使用:

var items=GetMongoData<TestItem1>("test1", t=>t.Points>10); 
var items2=GetMongoData<TestItem2>("test2", t=>t.Name.Contains("a")); 
相關問題