情况就是这样.我有这样的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 IEnumerableRead() { 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 IEnumerableRead(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.呃...真的很抱歉我的英语
正如WiredPrainie在评论中所述,您应该使用IQueryable
而不是以IEnumerable
其他方式检索整个集合.请仔细阅读本指南
http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/