2011-04-07 32 views
3

最初にいくつかの背景.. Telerik MVCグリッドを使用してデータを表示しています。グリッドは、IEnumerableが自分のページのグリッドモデルクラスに渡されることを前提としています。AutoMapperを使用してLINQクエリ結果をViewModelオブジェクトにマップする

このデータをJSONとしてajax経由で渡すときに循環参照を避けるには、モデルオブジェクトを表示するためのEF linq querys ... AutoMapperは私の選択方法ですが、AutoMapperを使用する唯一の解決策は、パフォーマンスが非常に悪いということです。

ものを作るためにautomapperを使用している間、私は、グリッドによって呼び出された私のアクションメソッドへの私の見解モデルタイプのIEnumerableをを返すリポジトリ..

public IEnumerable<ResultViewModel> Search() 
    { 
     var person = _context.Persons; 

     //this works and is the best performance wise but could be made simpler with automapper 
     var result = person.Select(x => new ResultViewModel 
          { 
           FirstName = x.firstName, 
           LastName = x.lastName, 
           ///etc... 
          }); 

     //THIS IS SLOW but works 
     //var result = Mapper.Map<IEnumerable<Person>, IEnumerable<ResultViewModel>>(person); 

     //this does not work and errors at runtime 
     //var result = person.Select(x => Mapper.Map<Person, ResultViewModel>(x)); 

     return result; 

    } 

自分のパフォーマンスを維持する方法上の任意のアイデアを持っていますより簡単に。私はautomapperを使用している遅いバージョンがpersonコレクションが列挙されていると仮定しています...その後、telerikグリッドによって後で解析されます。

+0

'person.Select(x => Mapper.Map (x))'のエラーはどうですか? – smartcaveman

+0

@smartcavemanエラー:LINQ to Entitiesがメソッド....を認識せず、このメソッドをストア式に変換できません – stephen776

+0

これは 'IQueryable'が評価されていないことを意味します。 jfarの答えはうまくいくはずです – smartcaveman

答えて

1

あなたはSelect(N + 1)ループが関連するプロパティをロードしているため、別の選択クエリが発行されています。

automapperを使用するとパフォーマンスに問題はありません。

自動化してIQueryableチェーンを解除する前に、ToList()(人ではないはずです)に電話してみてください。

+0

ToList()はまだ同じ問題を試しています...私の要求は約50msかかる速い方法... automappper方法、それは700-850msかかります – stephen776

+0

コンテキストで遅延ロードをオフにして、やり直してください。 – jfar

+0

遅延ロードをオフにすると、レスポンス時間から数時間もかかりませんでしたが、関連するクラスのプロパティを返すこともできなくなりました。 – stephen776

関連する問題