所以我們有如下兩種方法:重構重複Lambda表達式
方法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
});
}
方法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
});
}
可以看出是有很多重複的代碼。第二種方法返回一個強類型的視圖模型,而第一個方法返回一個對象,因爲包含了兩個額外的屬性(language_group和culture)。
第二種方法用於填充MVC視圖,第二種方法用於導出到Excel函數。 重新分解這個以減少重複的最佳方式是什麼?
總是使用'CentreViewModel',如果不需要'language'和'culture' null? – paul
更適合[代碼評論](http://codereview.stackexchange.com/)。 –
從一半的答案看來,我應該放棄