在小型本地数据库中获取过滤数据时遇到了性能问题。我减少了代码(如下所示)来重现问题。输出大约是2000ms。
其他一些信息:
代码:
public class UnitTest1
{
public void TestMethod2()
{
Stopwatch sw = new Stopwatch();
sw.Start();
new BaseRepository<TickerData>().GetById("5731d39062deb83134772e77");
sw.Stop();
Debug.Write(sw.Elapsed.TotalMilliseconds);
}
}
public class BaseRepository<T> : MongoBase where T : BaseEntity
{
MongoDatabase DataBase { get; set; }
protected IQueryable<T> Collection { get; set; }
MongoCollection<BsonDocument> mCollection { get; set; }
public BaseRepository()
{
DataBase = Server.GetDatabase("TradingBot");
mCollection = DataBase.GetCollection<BsonDocument>(typeof(T).Name);
Collection = mCollection.AsQueryable<T>();
}
public T GetById(string ID)
{
return Collection.Single(i => i.Id.ToString() == ID);
}
}
更新: 建议根据@rnofenko(见评论)取得了巨大的进步,但似乎仍然有点慢?
答案 0 :(得分:1)
这是一个棘手的时刻。 您可以从 System.Linq 调用扩展方法单个。实际上,您从DB加载整个集合,并在应用程序中按ID进行选择。
相反,您需要使用MongoDB扩展方法 - MongoDB.Driver.Linq 中的 SingleAsync 。
public async Task<T> GetById(string id)
{
return await Collection.SingleAsync(x => x.Id == new ObjectId(id));
}