2009-03-07 2 views
1

Я работаю над трехуровневым веб-приложением, в котором я использую Microsoft Entity Framework. Чтобы создать свободную связь между различными слоями, я использую объекты передачи данных для передачи между объектами Entity Framework и моими пользовательскими объектами, но у меня есть проблема со скоростью перевода между инфраструктурой сущности и моими настраиваемыми DTO. Я использую этот метод для передачи с EF в DTO:Объекты передачи данных и структура Entity

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. Я работаю над довольно быстрым ПК, поэтому скорость моего компьютера замедляет его.

+0

Поскольку вы нашли и исправили проблему, было бы хорошо для вас, чтобы обновлять этот вопрос так, что будущие читатели могут узнать - или, по крайней мере, не будет ввели в заблуждение. – Bevan

ответ

1

Код, который вы отправили, более чем переводит между типом EF и типом DTO - вы также извлекаете данные из базы данных. Попытайтесь отделить эти два для целей измерения. Скорее всего, это поиск данных, который занимает 10 секунд, а не время, затрачиваемое на перемещение данных в памяти.

+0

Я не вижу, где я взаимодействую с базой данных в этой функции? Я mearly создает новый список из списка, который является параметром? – 2009-03-07 15:24:43

+0

Возможно, я читал это неправильно. Почему вы проходите и возвращаете «Список» вместо списка и List ? Каков фактический параметр вызова метода? Вы уверены, что это список, а не IQueryable? –

+0

Я не знаю, видели ли вы определение func в верхней части (public Transform (Список carModelDefinition)). Я возвращаю DTO вместо Datalayer.Carmodeldefinition, потому что в пользовательском интерфейсе я не вижу никакой связи между DataLayer и пользовательским интерфейсом - поэтому я использую DTO. – 2009-03-07 19:36:30

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, и когда я создаю новый объект, он будет создавать новый экземпляр все время, что потребовало много времени.

0

DRY! Попробуйте использовать генератор DTO/Assembler, например EntitiesToDTOs. Он генерирует DTO и ассемблеры из вашего EDMX-файла Entity Framework. Таким образом, вы не должны кодировать каждое отображение Entity/DTO, ассемблеры будут добавлены методы расширения для ваших лиц и порожденных DTOs, так что вы в конечном итоге кодирования:

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(); 

Довольно просто и инструмент очень прост в использовании.

Смежные вопросы