2009-03-07 18 views
1

私は、Microsoft Entity Frameworkを使用している3層Webアプリケーションに取り組んでいます。 エンティティフレームワークオブジェクトと私のカスタムオブジェクトの間でデータ転送オブジェクトを使用して異なるレイヤ間の結合を緩やかにするには、エンティティフレームワークとカスタムDTOの間の変換速度に問題があります。 私はEFからDTOに転送するために、このメソッドを使用します。データ転送オブジェクトとEntity Framework

public List Transform(List carModelDefinition) {

 List<CarDefinitionDTO> cdDTOList = new List<CarDefinitionDTO>(); 
     foreach (DataLayer.CarModelDefinition cmd in carModelDefinition) 
     { 
      CarDefinitionDTO cdDTO = new CarDefinitionDTO(); 
      cdDTO.CarDefinitionId = cmd.CarModelDefinitionId; 
      cdDTO.Compagny = cmd.Company; 
      cdDTO.Model = cmd.Model; 
      cdDTOList.Add(cdDTO); 
     } 
     return cdDTOList; 

} 

をしかし、私は、例えばのリストを転送しようとすると、 600要素には約10秒以上かかる。私は間違って何かをやっているのですか、それとも単に遅いスピードですか? NB。私は非常に高速なPC上で作業しているので、速度を落とす私のPCの速度ではありません。

+0

あなたが発見し、問題を修正しましたので、あなたは将来の読者が学ぶことができるように、この質問を更新するために、良いでしょう - あるいは少なくとも、ではありません間違った – Bevan

答えて

1

あなたが掲示したコードは、EFタイプとDTOタイプの間で翻訳する以外にも、データベースからデータを取得しています。測定のために両者を分離してください。メモリ内でデータを移動する時間ではなく、10秒かかるデータの取得である可能性があります。

+0

私はその機能でデータベースと対話する場所がわかりません。私は真剣にパラメータであるリストから新しいリストを作成しますか? –

+0

私はそれを間違って読んでいるかもしれません。 List とList の代わりに "List"を渡して返すのはなぜですか?メソッド呼び出しの実際のパラメータは何ですか?あなたはIQueryableではなく単なるリストであると確信していますか? –

+0

上のfunc定義を見たかどうかわかりません(public list Transform(List carModelDefinition))。 UIではDataLayerとUIの間の結合がないので、Datalayer.Carmodeldefinitionの代わりにDTOを返します。したがって、私はDTOを使用します。 –

0

私が言ってそれを読み込む:

 public List<CarDefinitionDTO> LoadAll() 
    { 
     List<DataLayer.CarModelDefinition> carList = (from cd in mee.CarModelDefinition select cd).ToList(); 
     CarDefinitionDTO cdDTO = new CarDefinitionDTO(); 
     List<CarDefinitionDTO> carDefList = cdDTO.Transform(carList); 
     return carDefList; 
    } 
2

私はエラーを検出しました。コンストラクタでは、Entity Managerのインスタンスを作成します。新しいオブジェクトを作成すると、常に新しいインスタンスが作成されるため、時間がかかります。

0

DRY! EntitiesToDTOsのようなDTO /アセンブラジェネレータを使用してみてください。 Entity Framework EDMXファイルからDTOとアセンブラを生成します。

var myCar = new Car(); 
CarDTO dto = myCar.ToDTO(); 
myCar = dto.ToEntity(); 

か::

ICollection<Car> carCol = new List<Car>(); 
ICollection<CarDTO> carDTOs = carCol.ToDTOs(); 
carCol = carDTOs.ToEntities(); 
そうすれば、あなたは、このようなコーディングを終わるので、アセンブラはのDTOを自分のエンティティに拡張メソッドを追加し、生成されますが、すべてのエンティティ/ DTOのマッピングをコーディングする必要はありません

かなりシンプルで使いやすいツールです。

関連する問題