public IActionResult SearchCalls(CallsFilter filter) { var searchResult = repo.SearchCalls(filter); List <Call> calls = searchResult.CallsPage.ToList(); var callsVm = calls.Select(c => new CallViewModel(c) { DstName = usersRepo.GetUser(c.Dst.ToString())?.Name, SrcName = usersRepo.GetUser(c.Src.ToString())?.Name, }); var json = Json(new { total = searchResult.TotalCalls, rows = callsVm }); return(json); }
public SearchResult SearchCalls(CallsFilter filter) { logger.LogInformation($"SearchCalls with filter: dst={filter.DstCallNumber}, " + $"src={filter.SrcCallNumber}, " + $"dtFrom={filter.CallDateFrom}, " + $"dtTo={filter.CallDateTo}"); var offset = filter.Offset; var pageSize = filter.Limit; var sortColumn = filter.Sort; var sortColumnDirection = filter.Order; int viewOffsetUTC = filter.OffsetUTC; IQueryable <Call> callsData = Enumerable.Empty <Call>().AsQueryable(); if (!string.IsNullOrWhiteSpace(filter.SrcCallNumber) && !string.IsNullOrWhiteSpace(filter.DstCallNumber)) { callsData = contexts.SelectMany(x => x.Calls.Where(c => c.CallDate >= filter.CallDateFrom.AddHours(x.OffsetUTC) && c.CallDate < filter.CallDateTo.AddHours(x.OffsetUTC) && c.Src == filter.SrcCallNumber && c.Dst == filter.DstCallNumber).AsQueryable().ToList().Select(c => { c.CallDateUTC = c.CallDate.AddHours(-x.OffsetUTC + viewOffsetUTC); return(c); })).AsQueryable(); } else if (!string.IsNullOrWhiteSpace(filter.SrcCallNumber)) { callsData = contexts.SelectMany(x => x.Calls.Where(c => c.CallDate.AddHours(-8) >= filter.CallDateFrom.AddHours(x.OffsetUTC) && c.CallDate < filter.CallDateTo.AddHours(x.OffsetUTC) && c.Src == filter.SrcCallNumber).AsQueryable().ToList().Select(c => { c.CallDateUTC = c.CallDate.AddHours(-x.OffsetUTC + viewOffsetUTC); return(c); })).AsQueryable(); } else if (!string.IsNullOrWhiteSpace(filter.DstCallNumber)) { callsData = contexts.SelectMany(x => x.Calls.Where(c => c.CallDate >= filter.CallDateFrom.AddHours(x.OffsetUTC) && c.CallDate < filter.CallDateTo.AddHours(x.OffsetUTC) && c.Dst == filter.DstCallNumber).AsQueryable().ToList().Select(c => { c.CallDateUTC = c.CallDate.AddHours(-x.OffsetUTC + viewOffsetUTC); return(c); })).AsQueryable(); } if (!(string.IsNullOrEmpty(sortColumn) && string.IsNullOrEmpty(sortColumnDirection))) { callsData = callsData.GroupBy(x => new { x.Src, x.Dst, CallDateUTC = x.CallDateUTC.AddSeconds(-x.CallDateUTC.Second) }). Select(g => g.First()).OrderBy(sortColumn + " " + sortColumnDirection); } int recordsTotal = callsData.Count(); var data = callsData.Skip(offset).Take(pageSize).ToList(); return(new SearchResult() { TotalCalls = recordsTotal, CallsPage = data }); }