public ApiResponse <IEnumerable <ApiModels.Audio> > GetAudios(AudioRequest request) { //builder user id list IEnumerable <int> userIds = request.Users.Select(x => x.UserId); //exclude old audios and get only audios for special users IQueryable <DataModels.Audio> audioQry = _dbContext .Audios .Where(x => !request.ExcludeAudios.Contains(x.Id) && userIds.Contains(x.UserId)) .OrderBy(x => Guid.NewGuid()); var audioQryList = new List <IQueryable <DataModels.Audio> >(); //builder queries foreach (var req in request.Users) { IQueryable <DataModels.Audio> userAudioQry = _dbContext .Audios .Where(x => x.UserId == req.UserId); if (!req.IsAudioMixes) { userAudioQry = userAudioQry.OrderBy(x => x.Order); } userAudioQry = userAudioQry.Take(req.AudioCount); audioQryList.Add(userAudioQry); } IQueryable <DataModels.Audio> totalAudioQry = audioQryList.FirstOrDefault() ?? Enumerable.Empty <DataModels.Audio>().AsQueryable(); for (int i = 1; i < audioQryList.Count; i++) { totalAudioQry = totalAudioQry.Concat(audioQryList[i]); } //materialize audios return(new ApiResponse <IEnumerable <ApiModels.Audio> >() { Ok = true, Data = totalAudioQry .ToList() .Select(x => ApiMapper.GetAudio(x)), }); }
public ApiResponse <IEnumerable <ApiModels.Audio> > GetAudios(DataModels.User user, int skip, int take) { if (take <= 0) { return new ApiResponse <IEnumerable <ApiModels.Audio> >() { Ok = true, Data = Enumerable.Empty <ApiModels.Audio>(), } } ; if (skip < 0) { skip = 0; } List <ApiModels.Audio> audioList = _dbContext.Audios .Where(x => x.UserId == user.Id) .OrderByDescending(x => x.Date) .Skip(skip) .Take(take) .ToList() .Select(x => ApiMapper.GetAudio(x)) .ToList(); for (int i = 0; i < audioList.Count(); i++) { AudioById audioEntity = _vkWebService.GetAudio(user.AccessToken, user.Id, audioList[i].VkId); string url = audioEntity?.response?.FirstOrDefault()?.url; audioList[i].Url = url; } return(new ApiResponse <IEnumerable <ApiModels.Audio> >() { Ok = true, Data = audioList.Where(x => !string.IsNullOrWhiteSpace(x.Url)), }); }
public ApiResponse <IEnumerable <ApiModels.Audio> > GetAudios(DataModels.User user, int scheduleId, int skip, int take) { if (take <= 0) { return new ApiResponse <IEnumerable <ApiModels.Audio> >() { Ok = true, Data = Enumerable.Empty <ApiModels.Audio>(), } } ; skip = skip <= 0 ? 1 : skip + 1; IEnumerable <int> pageNumbers = Enumerable.Range(skip, take); var scheduleQry = (from s in _dbContext.Schedules where s.Id == scheduleId join sr in _dbContext.ScheduleRows on s.Id equals sr.ScheduleId select new { Schedule = s, ScheduleRow = sr } into scheduleRows group scheduleRows by scheduleRows.ScheduleRow.UserId into _s select new { UserId = _s.Key, ScheduleRows = _s, } into userRows from pn in pageNumbers select userRows.ScheduleRows.Select(x => new { GroupIndex = x.ScheduleRow.GroupIndex + (userRows.ScheduleRows.Count() * (pn - 1)), Order = x.ScheduleRow.Order + (x.Schedule.BlockSize * (pn - 1)), UserId = x.ScheduleRow.UserId, })) .SelectMany(x => x); List <ApiModels.Audio> audioList = (from s in scheduleQry join a in _dbContext.Audios on new { index = s.GroupIndex, userId = s.UserId } equals new { index = a.Order, userId = a.UserId } join ma in _dbContext.MixAudios on new { index = s.GroupIndex, userId = s.UserId } equals new { index = ma.Order, userId = ma.UserId } into _ma from ma in _ma.DefaultIfEmpty() join m in _dbContext.Audios on new { audioId = ma.AudioId, userId = ma.UserId } equals new { audioId = m.Id, userId = m.UserId } into _m from m in _m.DefaultIfEmpty() where ma == null || ma.ScheduleId == scheduleId select new { Audio = m ?? a, Order = s.Order, }) .OrderBy(x => x.Order) .ToList() .Select(x => ApiMapper.GetAudio(x.Audio)) .ToList(); for (int i = 0; i < audioList.Count(); i++) { AudioById audioEntity = _vkWebService.GetAudio(user.AccessToken, user.Id, audioList[i].VkId); string url = audioEntity?.response?.FirstOrDefault()?.url; audioList[i].Url = url; } return(new ApiResponse <IEnumerable <ApiModels.Audio> >() { Ok = true, Data = audioList.Where(x => !string.IsNullOrWhiteSpace(x.Url)), }); }