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()NB:はい、コマンドでインデックスも再構築しました

ここで奇妙なこと... 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 ミリ秒かかります。どうして??

最初のアプローチでは、2番目のアプローチではなくidが増加するため、パフォーマンスが低下するのはなぜですか?

Ps。ええと...私の英語で本当にごめんなさい

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 に答える