为什么我失去性能,如果我在MongoDB上使用LINQ

本文关键字:LINQ MongoDB 如果 失去 性能 为什么 | 更新日期: 2023-09-27 18:12:38

情况就是这样。我有一个域对象Product,像这样…

[DataContract]
public class Product : IStorableEntity
{
    [DataMember]
    public String Id { get; set; }
    [DataMember]
    public String RemoteId { get; set; }
    [DataMember]
    public String LanguageId { get; set; }
    [DataMember]
    public DateTime? CreationDate { get; set; }
    [DataMember]
    public DateTime? LastUpdate { get; set; }
    ETC..ETC...
}

到我的存储库层,我有以下方法:

public IEnumerable<TElement> Read()
{
    var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
    return mongoCollection.AsQueryable<TElement>();
}

使用这种方法,我想通过LINQ公开我的存储库层,而不导出有关技术的信息。

我可以这样做:

var _repository = new MyRepositoryFactory<Product>(); 
var result = _repository.Read().Where(p=>p.RemoteId == "1")

这个查询需要1或2毫秒。

相反……

var _repository = new MyRepositoryFactory<Product>();
var result = _repository.Read().Where(p=>p.RemoteId == "29000")

需要2800毫秒!!

我已经用命令

正确地创建了一个唯一索引

db.products.ensureIndex({"RemoteId":1, unique:true})

NB:是的,我也用.reIndex()命令重建了索引

奇怪的是……

避免LINQ和修改…中的存储库方法
public IEnumerable<TElement> Read(string remoteId)
{
    var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
      var query = Query<TElement>.EQ(p => p.RemoteId, remoteId);
    return mongoCollection.Find(query);
}

如果我调用之前id相同的方法…

var _repository = new MyMongoRepository<Product>();
var result = _repository.Read("29000")

需要1或2毫秒。为什么? ?

为什么第一种方法的性能会随着id的增加而下降,而第二种方法不是这样吗?

p。嗯…

为什么我失去性能,如果我在MongoDB上使用LINQ

正如WiredPrainie在评论中所说,您应该使用IQueryable而不是IEnumerable,否则将检索整个集合。仔细阅读本指南http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/