So we’ve got two methods shown below:
Method 1
private IEnumerable<object> CreateCentreViewModelForExport(IQueryable<CentreTranslation> centreTranslation)
{
return centreTranslation.Select(s => new
{
id = s.Centre.id,
centreTranslationId = s.id,
name = s.Centre.name,
number = s.Centre.number,
date_opened = s.Centre.date_opened,
address_line_1 = s.address_line_1,
address_line_2 = s.address_line_2,
address_line_3 = s.address_line_3,
city = s.city,
county = s.county,
country = s.Centre.Country.name,
//country_id = s.Centre.country_id,
translatedCountry = s.country,
postcode = s.postcode,
hidden = !(s.Centre.CentreStatus.Where(w => w.environment_id == 4).FirstOrDefault().active),
about = s.about,
virtualTour = s.Centre.virtual_tour,
directions = s.directions,
phone = s.Centre.phone,
fax = s.Centre.fax,
email = s.Centre.email,
lat = s.Centre.position.Latitude,
lng = s.Centre.position.Longitude,
imageCount = s.Centre.image_count,
translatedCentreName = s.name,
amenities = s.amenities ,
features = s.FeatureTranslations.Select(s2 => new FeatureViewModel()
{
id = s2.id,
name = s2.Feature.name,
selected = s2.selected
}),
businessCentreAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.BusinessCentre).FirstOrDefault().about,
officeSpaceAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.OfficeSpace).FirstOrDefault().about,
virtualOfficeAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.VirtualOffice).FirstOrDefault().about,
meetingRoomsAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.MeetingRooms).FirstOrDefault().about,
businessLoungeAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.BusinessLounge).FirstOrDefault().about,
dayOfficeAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.DayOffice).FirstOrDefault().about,
language_group = s.Language.language_group,
culture = s.Language.cuture
});
}
Method 2
private IQueryable<CentreViewModel> CreateCentreViewModel(IQueryable<CentreTranslation> centreTranslation)
{
return centreTranslation.Select(s => new CentreViewModel()
{
id = s.Centre.id,
centreTranslationId = s.id,
name = s.Centre.name,
number = s.Centre.number,
date_opened = s.Centre.date_opened,
address_line_1 = s.address_line_1,
address_line_2 = s.address_line_2,
address_line_3 = s.address_line_3,
city = s.city,
county = s.county,
//country = s.Centre.Country.name,
country_id = s.Centre.country_id,
translatedCountry = s.country,
postcode = s.postcode,
hidden = !(s.Centre.CentreStatus.Where(w => w.environment_id == 4).FirstOrDefault().active),
about = s.about,
virtualTour = s.Centre.virtual_tour,
directions = s.directions,
phone = s.Centre.phone,
fax = s.Centre.fax,
email = s.Centre.email,
lat = s.Centre.position.Latitude,
lng = s.Centre.position.Longitude,
imageCount = s.Centre.image_count,
translatedCentreName = s.name,
amenities = s.amenities,
features = s.FeatureTranslations.Select(s2 => new FeatureViewModel()
{
id = s2.id,
name = s2.Feature.name,
selected = s2.selected
}),
businessCentreAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.BusinessCentre).FirstOrDefault().about,
officeSpaceAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.OfficeSpace).FirstOrDefault().about,
virtualOfficeAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.VirtualOffice).FirstOrDefault().about,
meetingRoomsAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.MeetingRooms).FirstOrDefault().about,
businessLoungeAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.BusinessLounge).FirstOrDefault().about,
dayOfficeAbout = s.ProductTranslations.Where(w => w.Product.id == (int)Products.DayOffice).FirstOrDefault().about
});
}
As can be seen there is a lot of duplicate code. The second method returns a strongly typed view model, while the first returns an object due to the inclusion of two extra properties (language_group and culture).
The second method is used to populate an MVC view, the second for an export to Excel function.
What’s the best way of re factoring this to minimize the duplication?
Create a static
FromCentreTranslationmethod in the CentreViewModel class, and put all initialization there:You can then refactor the original two methods like:
and