Я использую 5 API отелей и стараюсь объединить и выбрать минимальный отель с уникальными отелями из всех API. Я следую этим STEPSКак повысить производительность вызова API
- Позвонить по всем 5 APIs и ждать ответа.
- получить все статические данные из базы данных или, если воспользоваться моей кэширования сервера (все 5 API, такие как название гостиницы, изображения, описания и т.д.)
- Объединить в один пользовательский класс
- получить карту кодов ГИАТА от кэширования или базы данных.
- Применить GIATA в API результат и собрать все отели с уникальным идентификатором GIATA.
- Выберите минимальную цену.
Bind UI и показать клиенту.
string sessionid = sqf; DS.Models.BL.Common.HotelSearchDetails details = new DS.Models.BL.Common.HotelSearchDetails(); details = (.Models.BL.Common.HotelSearchDetails)Session["Details_" + sessionid]; List<DS.BL.Common.HotelDetails> DOTWhdlist = new List<DS.BL.Common.HotelDetails>(); List<DS.BL.Common.HotelDetails> GTAhdlist = new List<DS.BL.Common.HotelDetails>(); List<DS.BL.Common.HotelDetails> HPhdlist = new List<DS.BL.Common.HotelDetails>(); List<DS.BL.Common.HotelDetails> HBhdlist = new List<DS.BL.Common.HotelDetails>(); List<DS.BL.Common.HotelDetails> TSGhdlist = new List<DS.BL.Common.HotelDetails>(); //GTA City Cache DS.Models.BL.GTA_Model.Methods.HotelInfo hinfo = new Models.BL.GTA_Model.Methods.HotelInfo(); List<GTA.API.HotelSearch.GTAHotels> hlist = new List<GTA.API.HotelSearch.GTAHotels>(); hlist = hinfo.GethotellistCityWise(details.GTACityCode); // /************************************************* * DOTW cache * *************************************************/ DS.BL.DOTW.Method.HotelInfo objhoteldetails = new DS.BL.DOTW.Method.HotelInfo(); Dictionary<string, int> dictionary = objhoteldetails.Gethotelratings(); List<DOTW.Method.searchhotels.DotwHotels> objhotellist = new List<DOTW.Method.searchhotels.DotwHotels>(); objhotellist = objhoteldetails.GethotellistCityWise(details.DOTWCityCode); //------------------------------------------------------------------------------------------------------- //------Hotel pro cache city DS.BL.HotelsPro.Method.GetHotelDetails objhoteldetails_hp = new BL.HotelsPro.Method.GetHotelDetails(); List<HotelsPro.Method.Avail.HotelsProHotels> objhotellist_hp = new List<HotelsPro.Method.Avail.HotelsProHotels>(); objhotellist_hp = objhoteldetails_hp.GethotellistCityWise(details.HotelsProCityCode); /*************************************************** * Hotelbeds city cache * */ DS.Models.BL.HotelBeds.Methods.HotelInfoController objhotelbeds = new DS.Models.BL.HotelBeds.Methods.HotelInfoController(); List<HotelBeds.Method.SearchHotel.HotelBedsHotels> HBhotellist = new List<HotelBeds.Method.SearchHotel.HotelBedsHotels>(); HBhotellist = objhotelbeds.GethotellistCityWise(details.HBCityCode); /************************************************** * * TSG city cache * */ DS.Models.BL.TSG.Methods.HotelInfo objtsg_hotel = new Models.BL.TSG.Methods.HotelInfo(); List<TSG.API.HotelAvail.TSGHotels> TSGhlist = new List<TSG.API.HotelAvail.TSGHotels>(); TSGhlist = objtsg_hotel.GethotellistCityWise(details.City); //--------------------------------------------------------------------------------------------------------------------- var dotw = Task<List<DS.BL.Common.HotelDetails>>.Factory.StartNew(() => Dotw(sqf, details, dictionary, objhotellist)); var gta = Task<List<DS.BL.Common.HotelDetails>>.Factory.StartNew(() => GTA(sqf, details, hlist)); var hotelpro = Task<List<DS.BL.Common.HotelDetails>>.Factory.StartNew(() => Hp(sqf, details, objhotellist_hp)); var hotelbeds = Task<List<DS.BL.Common.HotelDetails>>.Factory.StartNew(() => HB(sqf, details, HBhotellist)); var tsg = Task<List<DS.BL.Common.HotelDetails>>.Factory.StartNew(() => TSG(sqf, details, TSGhlist)); DOTWhdlist = dotw.Result; TSGhdlist = tsg.Result; GTAhdlist = gta.Result; HPhdlist = hotelpro.Result; HBhdlist = hotelbeds.Result; ViewBag.sessionId = sessionid; DOTWhdlist.AddRange(GTAhdlist); DOTWhdlist.AddRange(HPhdlist); DOTWhdlist.AddRange(HBhdlist); DOTWhdlist.AddRange(TSGhdlist); string[] c = details.CityName.Split(','); string cityname = c[0]; List<DS.BL.Common.HotelDetails> filterdata = GiataApply(DOTWhdlist, cityname, details.GiataCityid); List<DS.BL.Common.HotelDetails> tsgdata = filterdata.Where(x => x.giataref == "exclusivelyhotels").ToList(); List<DS.BL.Common.HotelDetails> gtadata = filterdata.Where(x => x.giataref == "gta").ToList(); List<DS.BL.Common.HotelDetails> dotwdata = filterdata.Where(x => x.giataref == "DOTW").ToList(); List<DS.BL.Common.HotelDetails> hpdata = filterdata.Where(x => x.giataref == "metglobal").ToList(); List<DS.BL.Common.HotelDetails> hbdata = filterdata.Where(x => x.giataref == "hotelbeds").ToList(); allSup.dotw = dotwdata;
ГИАТА ДЕЙСТВИЕ
List<DS.BL.Common.HotelDetails> GiataApply(List<DS.BL.Common.HotelDetails> hlist, string city, int Cityid)
{
DS.Models.BL.Common.GIATA.giataCodes giataCodes = new Models.BL.Common.GIATA.giataCodes();
List<GiataProperty> gcode = new List<GiataProperty>();
gcode = giataCodes.GiataCodes(city, Cityid);
var query = from h in hlist
join g in gcode on new { hotelcode = h.HotelId, supcode = h.giataref }
equals new { hotelcode = g.Hcode, supcode = g.ProviderCode }
select new DS.BL.Common.HotelDetails
{
HotelName = h.HotelName,
HCode = h.HCode,
HotelId = h.HotelId,
Address = h.Address,
image = h.image,
location = h.location,
Currency = h.Currency,
searchId = h.searchId,
Price = h.Price,
rating = h.rating,
hoteldescription = h.hoteldescription,
Latitude = h.Latitude,
Longitude = h.Longitude,
imagelist = h.imagelist,
Source = h.Source,
giataref = h.giataref,
HFullResponse = h.HFullResponse,
AvailableRoomList = h.AvailableRoomList,
HotelRooms = h.HotelRooms,
facilities = h.facilities,
faDetails = h.faDetails,
giata = g.giataId.Value,
hotelservices = h.hotelservices,
gtaIDref = h.gtaIDref
};
var filter = from x in query
group x by x.giata into hotels
select new DS.BL.Common.HotelDetails
{
HotelName = hotels.FirstOrDefault().HotelName,
HCode = hotels.FirstOrDefault().HCode,
HotelId = hotels.FirstOrDefault().HotelId,
Address = hotels.FirstOrDefault().Address,
image = hotels.FirstOrDefault().image,
location = hotels.FirstOrDefault().location,
Currency = hotels.FirstOrDefault().Currency,
searchId = hotels.FirstOrDefault().searchId,
imagelist = hotels.FirstOrDefault().imagelist,
Price = hotels.Min(p => p.Price),
rating = hotels.FirstOrDefault().rating,
hoteldescription = hotels.FirstOrDefault().hoteldescription,
Latitude = hotels.FirstOrDefault().Latitude,
Longitude = hotels.FirstOrDefault().Longitude,
Source = hotels.FirstOrDefault().Source,
giataref = hotels.FirstOrDefault().giataref,
HFullResponse = hotels.FirstOrDefault().HFullResponse,
AvailableRoomList = hotels.FirstOrDefault().AvailableRoomList,
HotelRooms = hotels.FirstOrDefault().HotelRooms,
facilities = hotels.FirstOrDefault().facilities,
faDetails = hotels.FirstOrDefault().faDetails,
giata = hotels.FirstOrDefault().giata,
hotelservices = hotels.FirstOrDefault().hotelservices,
gtaIDref = hotels.FirstOrDefault().gtaIDref
};
return filter.ToList();
//return query.ToList();
}
Нет этот процесс принимает 30-45 сек. Я хочу уменьшить, я не знаю, как это сделать, но в API-вызове мне нужно сократить время и применить GIATA.
дают мне идеи, ребята Thanks
, если вы видите мой код, я вызываю API в Task, поэтому этот вызов параллелен, поэтому нет необходимости вызывать async здесь –
Профилируйте свой код. Это время вызова API или SQL? – user902384