我正在尝试从我的数据库中选择值,但是目前我无法使用它,虽然我知道该方法不会将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;
答案 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);