使用QueryBuilder选择MongoDB

时间:2013-12-31 14:41:42

标签: c# .net mongodb mongodb-.net-driver

我正在尝试从我的数据库中选择值,但是目前我无法使用它,虽然我知道该方法不会将QueryBuilder类作为参数,但我不知道如何处理它。我只找到了带有一个参数的查询解决方案,或者所有参数都不为空。在我的情况下,我有一个带ID的List,以及4个参数,这些参数不必传递给函数,因此它们可以为null。

我目前的代码是这样的。

collection = db.GetCollection<Datapoint>("test");

var query = new QueryBuilder<Datapoint>();
var queryattributes = new List<IMongoQuery>();
var ids = new List<IMongoQuery>();

// Add all Attributes if there
if (fromdate != null)
{
     BsonDateTime from = BsonDateTime.Create(fromdate);
     queryattributes.Add(Query.GTE("UTCTimestamp", from));
}
if (to != null)
{
    BsonDateTime bto = BsonDateTime.Create(to);
    queryattributes.Add(Query.LTE("UTCTimestamp", bto));
}
if (evId != null)
{
    queryattributes.Add(Query.EQ("EvId", evId));
}
if (evType != null)
{
    queryattributes.Add(Query.EQ("EvType", evType));
}

// Add all ID's
Parallel.ForEach(idList, data =>
{
    lock (query)
    {
        ids.Add(Query.EQ("CId", data));
    }
});

// But everything in the Query
query.Or(ids);

// Add Queryattributes if there
if (queryattributes.Count > 0)
{
    query.And(queryattributes);
}

var result = collection.FindAs<Datapoint>(query);

我试图在没有Linq的情况下做到这一点,因为我发现了无数的测试,这说明linq要慢很多,而且因为我想将它作为Databasetest运行,所以我需要性能来执行大量的查询

Linq查询看起来像这样

var query2 =
    from e in collection.AsQueryable<Datapoint>()
    where idList.Contains(e.CId)
        && (evtId == null || e.EvId == evId)
        && (evType == null || e.EvType == evType.Value)
        && (fromdate == null || Query.GTE("UtcTimestamp", BsonDateTime.Create(fromdate)).Inject())
        && (to == null || Query.LT("UtcTimestamp", BsonDateTime.Create(to)).Inject())
    select e;

1 个答案:

答案 0 :(得分:1)

QueryBuilder不会在其中保存查询。您可以使用它来生成IMongoQuery,然后使用该查询来实际查询数据库。

代码的结尾看起来应该是这样的;

// But everything in the Query
IMongoQuery mongoQuery = query.Or(ids);

// Add Queryattributes if there
if (queryattributes.Count > 0)
{
    mongoQuery = query.And(queryattributes);
}

var result = collection.FindAs<Datapoint>(mongoQuery);