MongoDB C# 创建一个函数,我可以将 type/class 名称作为参数传递给它

MongoDB C# create a function that I can pass a type/class name to it as paramater

我有一个功能(见下文)。

它非常适合我需要它做的事情,我还有另一个几乎完全相同的东西,除了这两行:

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

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

我希望能够以某种方式使函数动态化,这样我就可以传递它,这样我就可以将同一个函数用于多个 purposes/types 而不需要为每个函数都创建一个新函数。

对于以上两行,我想看看是否可以通过某种方式将集合中的对象作为参数传递给函数?

或者最坏的情况是有一个 switch 语句来检查我传递的字符串值并说如果是这样,将其设置为那个,否则将其设置为其他内容。这样做的问题是我无法在 switch 语句内创建变量,如果我尝试在 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    

如果我明白你想要什么,你可以试试这个:

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"));

我能够找到允许我将 class 作为 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