Это ситуация. У меня есть объект домена 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... очень жаль моего английского