Почему я теряю производительность, если я использую LINQ для MongoDB? - программирование
Подтвердить что ты не робот

Почему я теряю производительность, если я использую LINQ для MongoDB?

Это ситуация. У меня есть объект домена 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})

NB: Да, я также перестроил индексы командой .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);
}

если затем я вызываю метод с тем же идентификатором до.

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

требуется 1 или 2 миллисекунды. ПОЧЕМУ??

Почему при первом подходе у меня есть ухудшение производительности, так как id увеличивается вместе со вторым, не так ли?

Ps. Erm... очень жаль моего английского

4b9b3361