2017-01-09 4 views
-1

私には関数があります(下記参照)。MongoDB C#型/クラス名をパラメータとして渡すことができる関数を作成します

それは私がそれを行うために必要なもののための素晴らしい作品、と私はほとんどこれらの2行を除いて、まったく同じことであるもう一つ持っている:私は何とか機能させることができるようにしたい

 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

私は私が通過を許可コードを見つけることができました私が必要とすることをするために働くようにNEWとしてのクラス。関数と呼び出しの新しいバージョンを参照してください:

私は同じ関数を呼び出し、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"));