就是这种情况。我有一个这样的域对象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})
注意:是的,我还用.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毫秒。 WHY ??
为什么第一种方法是性能下降,因为id增加而不是第二种不是它?
聚苯乙烯。呃......真的很抱歉我的英文
答案 0 :(得分:21)
正如WiredPrainie在评论中所述,您应该使用IQueryable
而不是IEnumerable
,否则将检索整个集合。
请仔细阅读本指南
http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/