当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如果我在MongoDB上使用LINQ,为什么会失去性能?》经验,为你挑选了1个好方法。

情况就是这样.我有这样的Domain对象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 Read()
{
    var mongoCollection = _mongoDatabase.GetCollection(_partitionName);
    return mongoCollection.AsQueryable();

}

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

通过这种方式,我可以这样做:

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

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

代替...

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

它需要2800毫秒!

我已使用该命令正确创建了唯一索引

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

注意:是的,我还用.reIndex()命令重建了索引

这里奇怪的是......避免使用LINQ并修改存储库方法......

public IEnumerable Read(string remoteId)
{
    var mongoCollection = _mongoDatabase.GetCollection(_partitionName);
      var query = Query.EQ(p => p.RemoteId, remoteId);
    return mongoCollection.Find(query);
}

如果那时我之前调用相同id的方法..

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

它需要1或2毫秒.为什么??

为什么使用第一种方法会导致性能下降,因为id会增加,而第二种方法不是吗?

PS.呃...真的很抱歉我的英语



1> 小智..:

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有