2013-05-08 69 views
14

這就是這種情況。我有一個域對象Product這樣的...爲什麼我在MongoDB上使用LINQ會失去性能?

[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})

注:是的,我也重建索引與.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增加而不是第二種方式?

Ps。呃...真的對不起我的英語

+0

您是否曾多次運行where(29000)查詢? – 2013-05-08 22:01:58

+32

嘗試將'IEnumerable '更改爲'IQueryable '。我相信你的代碼會導致整個集合被檢索,然後根據檢索到的數據在本地執行where子句。 – WiredPrairie 2013-05-08 22:08:52

+1

是WiredPrairie!有用! 2瓶啤酒給你! – Payedimaunt 2013-05-09 05:02:51

回答

20

由於WiredPrainie在評論中指出,你應該使用IQueryable而不是IEnumerable否則整個集合將被檢索。 仔細閱讀本指南 http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/

+0

關於整個文檔網站上的IQueryable沒有任何意見https://www.google.com.au/#q=iqueryable+site:mongodb.github.io/mongo-csharp-driver/2.0&gws_rd=cr,ssl – GONeale 2016-05-07 01:23:11

+0

嘗試使用「AsQueryable 「朋友。 – 2017-05-24 08:21:55

相關問題