19

这是这种情况。我有一个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 毫秒。为什么??

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

附言。呃……真的对不起我的英语

4

1 回答 1

30

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

于 2013-10-31T08:57:30.607 回答